簡體   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