4 Şubat 2019 Pazartesi

constexpr

Metodu Sonucu Tanımlama
constexpr Döndüren Metod yazısına taşıdım.

const Alan vs constexpr Alan
constexpr Alan derleme zamanı değer alır ve bir daha değiştirilemez. Ancak const alan runtime'da değer alır ve arık bundan sonra değiştirilemz. Bu yüzden bazı template metodlar const değişken ile derlenemezler. Şu kod derlenmez
const size_t n = 3;
Eigen::Matrix<double, n, n> A;
Şöyle yaparız
constexpr size_t n = 3;
Eigen::Matrix<double, n, n> A;
Eigen::Matrix<double, n, n> B;
1. Alan Tanımlama
Şöyle yaparız.
constexpr const char foo[] = "blee";
Şöyle yaparız.
constexpr double some_double = 1.0;
1.1 Alan Tanımla - String Literal
Şu kod uyarı verir. Çünkü constexpr char* sadece  constant pointer to a non-const char anlamına gelir.
// warning: ISO C++ forbids converting a string constant to ‘char*’    
static constexpr char* name_ = "A";       
Şöyle yaparız. Bu kod constant pointer to a constant char anlamına gelir.
static constexpr const char* name_ = "A";    
2. Static Alan Tanımlama
Şöyle yaparız.
constexpr static int x{20};
Eğer istenirse static bir alana referans bile alınabilir. Şöyle yaparız.
constexpr static int x{20};
constexpr const int& z = x;
3. Static Üye Tanımlama
C++17 ile şöyle yaparız.
class Foo
{
  public:
    constexpr static std::tuple<int, unsigned int, unsigned short> table[3]
    = {std::make_tuple(1, 2, 3),
        std::make_tuple(4, 5, 6),
        std::make_tuple(7, 8, 9)};
};
C++11 derleyicisinde şu satırı eklemek te gerekir.
constexpr std::tuple<int, unsigned int, unsigned short> Table_class::table[3];
En Eski Yöntem
Eski C++ ile integral olmayan static const değişkenleri sınıfın özelliği gibi tanımlamak mümkün değildi. Bu yüzden aşağıdaki gibi yapmak gerekiyordu.
//my_class.hpp
private:
static const double some_double;

//my_class.cpp
const double my_class::some_double = 1.0;

Diğer Notlar
1. Trivial Destructor'a Sahip Olmayan Şeyler constexpr Olamaz
Örnek'teki kod derlenmez!
constexpr const std::string foo = "blee";
2. constexpr'nin Sağ Tarafı da constexpr olabilir.
Bazı basit örnekler şöyle
static constexpr int arr[] = {1,2,3,4,5,6};
constexpr const int *first = arr;
constexpr const int *second = first + 1; // would fail if first wasn't constexpr
constexpr int i = *second;
Eğer constexpr'nin sağ tarafında kullanılan değişken de constexpr değilse derleme hatası alırız.
struct S {
    constexpr int f() const { return 1; }  
};

int main() {
    static constexpr S s{};
    const S *sp = &s;
    constexpr int i = sp->f(); // error: sp not a constant expression
}

4. if constexpr
if constexpr yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder