コンストラクタの明示的呼び出し

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しとけって話ですね。