[英]Is gcc 4.8.2 correct in invoking the copy constructor in this defaulted default constructor?
这是我要完成的一个简单的,自包含的,不可编译的gcc-4.8.2示例:
#include <atomic>
template <typename T>
class ValueParameter
{
public:
ValueParameter() = default;
ValueParameter(T initialValue) :
_val(initialValue)
{
}
private:
std::atomic<T> _val{T()};
};
ValueParameter<int> x;
我已经在其他几个gcc版本(包括5.3)上成功编译了此代码,但gcc 4.8.2失败并出现以下错误:
/tmp/gcc-explorer-compiler11658-82-1cqz6ui/example.cpp: In constructor 'ValueParameter<T>::ValueParameter() [with T = int]':
7 : error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
ValueParameter() = default;
^
In file included from /tmp/gcc-explorer-compiler11658-82-1cqz6ui/example.cpp:1:0:
我知道std::atomic<T>
是不可复制的,但是对我而言,编译器为何要尝试在默认构造函数中使用copy构造函数没有任何意义。 我确实发现改变了这一行:
std::atomic<T> _val{T()};
至
std::atomic<T> _val;
使文件成功编译。 统一初始化是该类先前版本的遗物,该早期版本的构造函数没有采用初始值。
这应该是一个错误吗? 此外,在这种情况下,成员被内联到类并在构造函数初始化器列表中被初始化,我应该期待什么行为? 我想要默认的构造函数将val
初始化为T()
,所以我认为我需要在这里进行括号初始化。
这绝对是gcc的错误,并且已由4.9修复。 您的代码绝对不会调用ValueParameter<T>
的副本构造函数-这样就不应实例化成员函数。 使用atomic<T>
的默认成员初始化器很好-实际上,可以从T
构造它。
此外,在这种情况下,成员被内联到类并在构造函数初始化器列表中被初始化,我应该期待什么行为?
默认成员初始化程序就是这样-默认值。 如果您在mem-initializer-list中提供了一个初始化程序(就像在ValueParameter(T )
构造函数中所做的ValueParameter(T )
),则默认值将被忽略。 如果您不提供这样的初始化程序(因为您不在ValueParameter()
),那么将使用默认值。
我想要默认的构造函数将val初始化为
T()
,所以我认为我需要在这里进行括号初始化。
您的代码应该精确地完成您想要的工作。 gcc 4.8这里有一个bug。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.