Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ emplace_back在静态constexpr成员上导致链接错误_C++_Language Lawyer_C++17_Constexpr_One Definition Rule - Fatal编程技术网

C++ emplace_back在静态constexpr成员上导致链接错误

C++ emplace_back在静态constexpr成员上导致链接错误,c++,language-lawyer,c++17,constexpr,one-definition-rule,C++,Language Lawyer,C++17,Constexpr,One Definition Rule,为什么emplace\u back引用需要定义的成员?emplace\u back(整型文字)和emplace\u back(静态constexpr整型成员)之间有什么区别 如果我切换到C++17,它可以很好地编译。我发现在C++17中,静态constexpr数据成员是隐式的。这是否意味着编译器会隐式地为它们创建一个定义 示例代码: class base { int n; public: base(int n):n(n) {} }; struct base_trait {

为什么
emplace\u back
引用需要定义的成员?
emplace\u back(整型文字)
emplace\u back(静态constexpr整型成员)
之间有什么区别

如果我切换到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;
}
类基{
int n;
公众:
基(int n):n(n){}
};
结构基特性{
静态constexpr int n=1;
};
内部主(空){
向量v;
v、 向后放置(1);//好的
v、 emplace_back(base_trait::n);//使用-std=c++14链接错误,使用-std=c++17链接正常
返回0;
}

正如您所说,
emplace\u back
通过引用获取参数,因此传递
base\u trait::n
会使其成为

如果一个对象的值被读取(除非它是编译时常量)或写入,它的地址被获取,或者引用被绑定到它,那么它就是odr

在C++17之前,这意味着这里需要定义
base\u trait::n
。但是自从C++17之后,行为发生了变化,因为不再需要类外定义

如果odr使用了const
非内联(自C++17起)
静态数据成员
或constepr静态数据成员(自C++11起)
,则仍需要命名空间范围内的定义,但它不能具有初始值设定项<代码>此定义不推荐用于constexpr数据成员(从C++17开始)。

静态数据成员可以内联声明。内联静态数据成员可以在类定义中定义,并可以指定初始值设定项。它不需要类外定义。(从C++17开始)


所以右值引用需要定义,左值引用也需要定义?@mljli它导致使用odr参数;它与左值引用相同。在C++17之前,这意味着需要定义。在C++17之后,不再需要定义静态constexpr数据成员,因此您的代码在C++17中可以正常工作。@mljli为什么希望rvalue ref不同?使用时,两者都只是普通引用(左值)。@curiousguy我认为const左值引用和rvalue引用不需要定义。静态常量成员只能用作文本,即没有存储/地址。@mljli您可以发布一个简单的引用示例,您认为它不需要定义吗?