2016-04-07 8 views
0

は、次のコードを考えてみましょう:自動およびコピーコンストラクタ:何が問題なのですか?

#include<queue> 
#include<type_traits> 

int main() { 
    std::queue<int> q; 
    auto p{q}; 
    static_assert(std::is_same<decltype(q), decltype(p)>::value, "fail"); 
} 

それはGCC 5.1.0hereを参照)、打ち鳴らす3.8.0hereを参照)と罰金コンパイルが、それはGCC 4.9としません。 0here参照)。
pのタイプがstd::initializer_listと推定されていることが原因と考えられます。

auto p{q}; 

ラインで::1のライン代入した場合の例として
は、それが動作

decltype(q) p{q}; 

私はわからないんだけど1が正しいと(たとえGCC 5.1.0私の期待に沿って動作します)それが私がここで尋ねた理由です。
pのタイプがstd::queue<int>と予想されるのは正しいですか?

+0

これは例外的な状況です。 Mayersはこれについて、C++ 11/14の "Effective modern C++"に書いています。 これは、自動のための特殊タイプの差し引きルールによるものです。自動宣言された変数 の初期化子が中括弧で囲まれている場合、推定される型はstd :: initial izer_listです。このようなタイプを推測できない場合(例えば、中括弧内の値が異なるタイプのため)、 – arturx64

+0

autoはC++ 11の機能であり、私が知っている限り、gccで5.1からのみ完全にサポートされています – Peregrin

答えて

0

{q}は、std::initializer_listと評価されます。コンパイラに何か他のものが欲しいかもしれないと言うことは何もないので、autoはそれを使います。

decltype(q)decltype({q})と同じではありません。

関連する問題