C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1
struct S {}; int main() { S v; S & r{ v }; // ?? }
gcc
gcc 4.8.2現在でも下記エラーが発生する。
error: invalid initialization of non-const reference of type 'S&' from an rvalue of type '<brace-enclosed initializer list>'
Clang
Clang 3.0では下記エラーが発生する。Clang 3.1以降では正常にコンパイル可能。
error: reference to type 'S' cannot bind to an initializer list S & r{ v }; // ?? ^~~~~~
MSVC
Visual Studio 2012(MSVC11)以前ではUniform Initializationに未対応。Visual Studio 2013(MSVC12)で正常にコンパイル可能。
関連URL
- C++ Standard Core Language Defect Reports, #1288 Reference list initialization
- c++ - Why can't I initialize a reference in an initializer list with uniform initialization? - Stack Overflow