次のステートメントを検討してください。
自動オブジェクトを値で初期化することは実際には不可能です。
この声明は本当ですか?これを行うことに問題はありません:
int main()
{
int i = int();
}
次のステートメントを検討してください。
自動オブジェクトを値で初期化することは実際には不可能です。
この声明は本当ですか?これを行うことに問題はありません:
int main()
{
int i = int();
}
この用語value-initialization
は、8.5 [dcl.init]段落16、4番目の箇条書きで定義されています。
イニシャライザが()の場合、オブジェクトは値で初期化されます。
つまり、自動変数の値の初期化は次のようになります。
int i();
i
ただし、これはを返すという関数の宣言ですint
。したがって、自動の値を初期化することはできません。この例では、一時変数は値で初期化され、自動変数はコピーで初期化されています。これには、アクセス可能なコピーコンストラクターがないテストクラスを使用して、コピーコンストラクターにアクセスできる必要があることを確認できます。
class noncopyable {
noncopyable(noncopyable const&);
public:
noncopyable();
};
int main() {
noncopyable i = noncopyable(); // ERROR: not copyable
}