コンストラクタの明示的呼び出し
VCでは
#include <iostream> class A { public: A(int i) : m_i(i){} A(const A& obj) : m_i(obj.m_i){} int m_i; }; int main() { A a(10); std::cout << a.m_i << std::endl; a.A::A(20); std::cout << a.m_i << std::endl; A b(30); a.A::A(b); std::cout << a.m_i << std::endl; return 0; }
こんな感じにコンストラクタを明示的に呼べるので、そういうもんだと思ってたんだけど
どうやら規格ではこれは禁止されているらしい。
試しにgccとcomeau C++(online ver)でためしてみたところ
//gcc4.3.2(cygwin) ArgTest.cpp: In function 'int main()': ArgTest.cpp:15: error: invalid use of 'class A' ArgTest.cpp:18: error: invalid use of 'class A'
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions "ComeauTest.c", line 15: error: a constructor or destructor may not have its address taken a.A::A(20); ^ "ComeauTest.c", line 18: error: a constructor or destructor may not have its address taken a.A::A(b); ^ 2 errors detected in the compilation of "ComeauTest.c".
ってなった。
要するにおとなしくplacement newしとけって話ですね。