5

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

// 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
}

这甚至可能吗?

4

2 回答 2

10

是的,没有;你可以使用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 变量的规则规定,你不能有一个不是定义的声明

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

因此,您不能对baz.

于 2013-01-31T00:04:17.117 回答
0

constexpr对于函数意味着inline,这意味着外部链接。所以你已经拥有了你想要的东西bar。至于bazand bing,你也可以在 C++17 中内联声明它们。

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

于 2019-10-21T21:51:27.230 回答