1. ホーム
  2. c++

[解決済み】デフォルトのコンストラクタに空白の括弧がある場合

2022-04-09 19:40:26

質問

C++でデフォルトコンストラクタを呼び出す際に、空の丸括弧(括弧)のセットが有効でないのは何か理由があるのでしょうか?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error

毎回、"()"と自動で入力してしまうようです。これが許されない正当な理由があるのでしょうか?

解決方法を教えてください。

最も厄介なパース

これは、「C++の最も厄介な構文」と呼ばれるものに関連しています。基本的に、コンパイラが関数宣言として解釈できるものはすべて関数宣言として解釈されます。

同じ問題の別の例です。

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v は、2つのパラメータを持つ関数の宣言と解釈されます。

回避策としては、もう一組の括弧を追加することです。

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

あるいは、C++11とリスト初期化(均一初期化ともいう)が利用できる場合です。

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

これでは、関数宣言と解釈されるわけがない。