は、次のコードを考えてみましょう:自動およびコピーコンストラクタ:何が問題なのですか?
#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.0(hereを参照)、打ち鳴らす3.8.0(hereを参照)と罰金コンパイルが、それはGCC 4.9としません。 0(here参照)。
p
のタイプがstd::initializer_list
と推定されていることが原因と考えられます。
auto p{q};
ラインで::1のライン代入した場合の例として
は、それが動作
decltype(q) p{q};
私はわからないんだけど1が正しいと(たとえGCC 5.1.0私の期待に沿って動作します)それが私がここで尋ねた理由です。
p
のタイプがstd::queue<int>
と予想されるのは正しいですか?
これは例外的な状況です。 Mayersはこれについて、C++ 11/14の "Effective modern C++"に書いています。 これは、自動のための特殊タイプの差し引きルールによるものです。自動宣言された変数 の初期化子が中括弧で囲まれている場合、推定される型はstd :: initial izer_listです。このようなタイプを推測できない場合(例えば、中括弧内の値が異なるタイプのため)、 – arturx64
autoはC++ 11の機能であり、私が知っている限り、gccで5.1からのみ完全にサポートされています – Peregrin