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ımlamaC++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.
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.constexpr std::tuple<int, unsigned int, unsigned short> Table_class::table[3];
En Eski Yöntem//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";
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
}
if constexpr yazısına taşıdım.
Hiç yorum yok:
Yorum Gönder