cpp14对constexpr的限制
时间: 2023-06-19 09:07:39 浏览: 217
constexpr函数的限制包括:
1.函数必须有明确的返回类型。
2.函数体必须非常简单,只能包含一些简单的语句,比如变量的赋值、算术运算、逻辑运算、成员函数的调用等,不允许有任何控制流语句,如if、for、while等等。
3.函数的参数必须是字面量类型(literal-type),也就是说,参数必须是可以编译时求值的类型。
4.函数可以有多个参数,但是所有参数的类型必须都是字面量类型。
总之,constexpr函数的主要限制是要求函数能够在编译时求值,所以函数体必须非常简单,不能有任何复杂的控制流,参数也必须是字面量类型。
相关问题
cpp17对constexpr的限制
### 回答1:
Cpp17对constexpr的限制主要有以下几个方面:
1. 函数体内只能有一个return语句
2. constexpr函数不能虚函数
3. constexpr函数不能有try-catch语句
4. constexpr函数内不能调用非constexpr函数
5. constexpr变量的值必须在编译期间能够确定。
请注意,以上限制只适用于Cpp17标准中constexpr的实现。不同的C++标准中constexpr会有不同的限制。
### 回答2:
C++17对constexpr的限制有以下几点:
1. constexpr函数必须是简单的计算型函数:C++17限制了constexpr函数的内容,要求函数只能包含简单的表达式、控制流语句和其他constexpr函数的调用。这意味着在constexpr函数中不能使用诸如动态内存分配、文件I/O、虚函数等复杂的操作。
2. constexpr变量必须具有常量表达式初始化器:C++17要求constexpr变量必须在声明时就被初始化,且初始化表达式必须是常量表达式。常量表达式是指编译期就能计算出结果的表达式,而不能依赖于运行时的计算。
3. 对constexpr函数求值的限制:C++17对于constexpr函数的求值也有一些限制。constexpr函数可以在编译时被求值,但不强制要求编译器在编译期间执行constexpr函数的求值。编译器可以选择在运行时延迟求值,只有在需要的时候才求值。
总的来说,C++17对constexpr的限制主要是为了确保constexpr函数和变量在编译期间能够被求值,且其初值的计算是确定的、不依赖于运行时的。这样可以使得constexpr能够在更多的场景下使用,并为编译期优化和静态检查提供了更大的可能性。
cpp11constexpr 函数和常量表达式
C++11 引入了 constexpr 关键字,用于指定函数或对象是常量表达式。常量表达式是在编译时就能计算出结果的表达式,它可以用于数组大小、模板参数等需要在编译时确定的地方。
constexpr 函数
constexpr 函数是指能在编译时求值的函数,它的返回值可以作为常量表达式使用。constexpr 函数的参数和返回值必须是字面类型。
例如,下面的函数就是一个 constexpr 函数:
```cpp
constexpr int square(int x) {
return x * x;
}
```
我们可以在编译时计算出 square(5) 的值,因此它是一个常量表达式。
constexpr 对象
constexpr 对象是指在编译时就能计算出值的对象。constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。
例如,下面的语句定义了一个 constexpr 对象:
```cpp
constexpr int max_num = 100;
```
我们可以在编译时就知道 max_num 的值是 100,因此它是一个常量表达式。
constexpr 函数和常量表达式的限制
constexpr 函数和常量表达式有一些限制:
1. constexpr 函数必须有一个返回值,而且返回值必须是字面类型。
2. constexpr 函数的函数体必须足够简单,能在编译时被求值。
3. constexpr 函数不能包含任何副作用,比如修改全局变量或调用非 constexpr 函数。
4. constexpr 函数的参数和返回值必须是字面类型。
5. constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。
6. constexpr 对象的类型必须是字面类型。
总结
constexpr 关键字用于指定函数或对象是常量表达式。constexpr 函数和常量表达式必须在编译时就能计算出值,它们有一些限制。constexpr 函数和常量表达式可以用于数组大小、模板参数等需要在编译时确定的地方。
阅读全文