yohhoyの日記

技術的メモをしていきたい日記

参照型の{}初期化

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