C++ gcc 4.8.2在此默认构造函数中调用复制构造函数是否正确?

C++ gcc 4.8.2在此默认构造函数中调用复制构造函数是否正确?,c++,c++11,constructor,C++,C++11,Constructor,下面是一个简单的、自包含的、不可编译的on-gcc-4.8.2示例,说明了我试图实现的目标: #include <atomic> template <typename T> class ValueParameter { public: ValueParameter() = default; ValueParameter(T initialValue) : _val(initialValue) { } private:

下面是一个简单的、自包含的、不可编译的on-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;
#包括

我知道
std::atomic
是不可复制的,但我不明白为什么编译器会尝试在默认构造函数中使用复制构造函数。我确实发现改变路线:

    std::atomic<T> _val{T()};
std::atomic _val{T()};

std::atomic\u val;
使文件成功编译。统一初始化是该类以前版本的遗留,该类的构造函数没有获取初始值


这应该是一个错误吗?此外,在这种情况下,我应该期待什么样的行为,在这种情况下,成员被内联到类中并在构造函数初始值设定项列表中初始化?我希望默认构造函数将
val
初始化为
T()
,因此我想我需要括号初始值设定项。

这肯定是一个gcc错误,而且他们已经在4.9中修复了这个错误。在任何情况下,您的代码都不会调用
ValueParameter
的复制构造函数,因此不应实例化成员函数。为
原子
使用默认成员初始值设定项很好-它确实可以从
T
构造

此外,在这种情况下,我应该期待什么样的行为,在这种情况下,成员被内联到类中并在构造函数初始值设定项列表中初始化

默认成员初始值设定项就是默认值。如果在mem初始值设定项列表中提供了初始值设定项(就像在
ValueParameter(T)
constructor中一样),则默认值将被忽略。如果未提供此类初始值设定项(如
ValueParameter()
中所没有),则使用默认值

我希望默认构造函数将val初始化为
T()
,因此我想我需要括号初始值设定项


您的代码应该精确地执行您希望它执行的操作。GCC4.8在这里有一个bug

不管怎样,IIRC C++11在gcc 4.8中在技术上仍然是“实验性的”:
    std::atomic<T> _val{T()};
    std::atomic<T> _val;