如何使用外部链接在命名空间范围内定义常量double?

Ste*_*mer 5 c++ constexpr c++11

我正在尝试使用外部链接创建名称空间范围常量

// in some include file:

namespace foo 
{
    constexpr double bar() { return 1.23456; } // internal linkage
    constexpr double baz = 1.23456;            // internal linkage
    const double bing = 1.23456;               // internal linkage
}
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?

Lig*_*ica 10

是的,不是 ; 你可以使用extern:

[C++11: 3.5/3]: 具有命名空间作用域(3.3.6)的名称具有内部链接(如果它的名称)

  • 显式声明的变量,函数或函数模板static; 要么,
  • 即明确地声明的变量 constconstexpr既不显式声明extern也不先前声明为具有外部连接 ; 要么
  • 匿名联盟的数据成员.

所以:

namespace foo 
{
    extern constexpr double bar() { return 1.23456; }
    extern constexpr double baz = 1.23456;
}
Run Code Online (Sandbox Code Playgroud)

在您的其他翻译单元中,您现在应该能够声明函数的名称并引用它:

#include <iostream>

namespace foo
{
   extern constexpr double bar();
}

int main()
{
   std::cout << foo::bar() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

然而,对于规则constexpr 的变量声明,你不能有一个声明,是不是也有定义:

[C++11: 7.1.5/9]:constexpr对象声明中使用的说明符将对象声明为const.这样的对象应具有文字类型并应初始化.[..]

所以,你不能采取相同的方法baz.