使用constexpr为函数创建别名是否符合C++标准?
关于用constexpr绑定模板函数实例的合法性说明
这种写法完全符合C++标准,不管原模板函数是不是constexpr,都合法,原因如下:
首先,
convert<B,A>是模板函数的一个实例化函数,本质就是一个普通函数(即使原模板没加constexpr)。函数的地址本身属于编译期常量表达式,所以可以用来初始化constexpr auto变量——C++标准允许用函数指针这类编译期常量初始化constexpr变量。举个实际例子验证,哪怕原函数不是
constexpr:
template<typename T, typename U> T convert(U&& u) { // 非constexpr的普通实现 return static_cast<T>(u); } struct A {}; struct B { B(const A&) {} }; // 完全合法,编译通过 constexpr auto convertAtoB = convert<B,A>; int main() { A a; B b = convertAtoB(a); // 正常调用 }
- 额外补充:如果原函数是
constexpr,这个constexpr变量存储的函数指针还支持编译期调用;如果原函数不是constexpr,变量只是存储函数地址,运行期调用即可,两种场景都符合标准要求。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

