9 c++ inline function constexpr
我正在验证关于C++ Primer的声明:
Unlinke其他函数,inline和constexpr函数可以在程序中多次定义.
我cfunc()
在下面使用了constexpr的两个定义,期望foo_0()
将调用第一个def同时foo_1()
调用第二个def.但是,尝试失败并出现编译错误(最后).为什么?
constexpr int cfunc(){
return 42;
}
int foo_0(){
return cfunc();
}
constexpr int cfunc(){
return 42;
}
int foo_1(){
return cfunc();
}
int main(int argc, char **argv) {
cout << foo_0() << endl;
cout << foo_1() << endl;
/* testconstexprfunc2.cpp:24:15: error: redefinition of ‘constexpr int cfunc()’ */
/* testconstexprfunc2.cpp:16:15: error: ‘constexpr int cfunc()’ previously defined here */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,与其他函数不同,可以在程序中多次定义内联函数和constexpr函数.但是,定义必须完全匹配.
来自§7.1.5/ 2 constexpr规范[dcl.constexpr]:
constexpr
函数和constexpr
构造函数是隐含的inline
.
从§3.2/ 6一个定义规则[basic.def.odr]:
一个类类型(第9条),枚举类型(7.2),
inline
具有外部链接的函数......在一个程序中可以有不止一个定义,前提是每个定义出现在不同的翻译单元中......
来自§7.1.2/ 4功能规格[dcl.fct.spec]:
一个
inline
功能应德网络定义在每一个翻译单元中,它是ODR-使用,而且必须具有在任何情况下完全一样去网络nition.
因此,由于constexpr
函数是隐式的,inline
因此它具有函数的所有属性inline
.因此,constexpr
函数可以具有多个定义,前提是每个定义出现在不同的转换单元中.
在您的情况下,程序失败,因为您违反了此规则.也就是说,您在同constexpr
一个翻译单元(即main.cpp)中重新定义了相同的函数.