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

时间:2013-01-31 00:02:44

标签: c++ c++11 constexpr

我正在尝试使用外部链接

创建名称空间范围常量
// 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
}

这甚至可能吗?

2 个答案:

答案 0 :(得分:9)

是的,没有;你可以使用extern

  

[C++11: 3.5/3]: 具有命名空间范围的名称(3.3.6)如果名称为,则具有内部链接

     
      
  • 显式声明为static的变量,函数或函数模板;或者,
  •   
  • 明确声明的变量 const constexpr 既未明确声明extern也未声明{有外部联系;或
  •   
  • 匿名工会的数据成员。
  •   

所以:

namespace foo 
{
    extern constexpr double bar() { return 1.23456; }
    extern constexpr double baz = 1.23456;
}

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

#include <iostream>

namespace foo
{
   extern constexpr double bar();
}

int main()
{
   std::cout << foo::bar() << '\n';
}

但是,constexpr 变量的规则表明you cannot have a declaration that is not also a definition

  

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

因此,您不能对baz使用相同的方法。

答案 1 :(得分:0)

函数的

constexpr表示inline,表示外部链接。因此,您已经有了bar想要的东西。至于bazbing,您也可以在C ++ 17中内联声明它们。

另请参阅https://stackoverflow.com/a/4193698/261217