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