c++ - emplace_back 导致静态 constexpr 成员上的链接错误
问题描述
为什么emplace_back
要引用需要定义的成员?emplace_back(integer literal)
和 和有什么不一样emplace_back(static constexpr integer member)
?
如果我切换到 C++17,它编译得很好。我发现在 C++17 中,静态 constexpr 数据成员是隐式内联的。这是否意味着编译器为它们隐式创建定义?
示例代码:
class base {
int n;
public:
base(int n):n(n) {}
};
struct base_trait {
static constexpr int n = 1;
};
int main(void) {
vector<base> v;
v.emplace_back(1); // ok
v.emplace_back(base_trait::n); // link error with -std=c++14, ok with -std=c++17
return 0;
}
解决方案
正如您所说,emplace_back
通过引用获取参数,因此传递base_trait::n
会导致它被odr-used。
如果对象的值被读取(除非它是编译时常量)或写入、获取其地址或绑定到它的引用,则该对象是 odr-used;
在 C++17 之前,这意味着base_trait::n
这里需要定义 of。但是由于 C++17 行为发生了变化,对于constexpr 静态数据成员,不再需要类外定义。
如果使用了 const
non-inline (since C++17)
静态数据成员or a constexpr static data member (since C++11)
,则仍然需要在命名空间范围内进行定义,但它不能有初始值设定项。This definition is deprecated for constexpr data members (since C++17).
静态数据成员可以内联声明。内联静态数据成员可以在类定义中定义,并且可以指定初始化器。它不需要类外定义。(C++17 起)
推荐阅读
- java - android带到前面无法处理卡片视图
- selenium - 从詹金斯执行硒代码时,UTF-8 字符无法正确显示
- python - 请求模块不适用于 Python3,但适用于 python
- prestashop - 管理单价单位 - Prestashop
- python - 使用 Python 以编程方式更改 stl CAD 文件
- wpf - TaskbarItemInfo 不显示 Indeterminate ProgressState
- akka - 将丰富的对象存储为具有持久性的演员是一个好主意吗?
- reactjs - React-Router 的问题
- google-cloud-platform - Google Cloud 功能 - 如何在调用 Google App Engine 时进行身份验证
- url - 如何在 Laravel 5.8 的中间件中编辑 $request-url 在它到达路由 API 之前