可以重新定义constexpr和内联函数吗?

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)

101*_*010 9

是的,与其他函数不同,可以在程序中多次定义内联函数和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)中重新定义了相同的函数.