繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM