Visual C++2012でDelegating constructorsを試す

VC++2012のNovember CTP of the C++ compilerお試しその3。
Delegating constructorsを試しましょう。

#include "stdafx.h"
#include <iostream>
#include <string>

class Test
{
	int data_;
	std::string msg_;
public:
	Test() : Test(123)
	{
		std::cout << "Test()" << std::endl;
	}
	Test(const char* pMsg) : Test(123, pMsg)
	{
		std::cout << "Test(const char* pMsg) " << pMsg << std::endl;
	}
	Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg)
	{
		std::cout << "Test(int val, const char* pMsg) "  << val << ',' << pMsg<< std::endl;
	}
	int getData() const { return data_; }
	const std::string getMsg() const { return msg_; }
	void disp() const
	{
		std::cout << getMsg() << ":"  << getData() << std::endl;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Test t1, t2("value"), t3(999), t4(111, "test");
	t1.disp();
	t2.disp();
	t3.disp();
	t4.disp();
}

で、

Test(int val, const char* pMsg) 123,data
Test()
Test(int val, const char* pMsg) 123,value
Test(const char* pMsg) value
Test(int val, const char* pMsg) 999,data
Test(int val, const char* pMsg) 111,test
data:123
value:123
data:999
test:111

と表示されます。

これも残念なことにIDE上はDelegating constructorの部分にエラーマークがでます。
実際には問題なくビルド可能です。

追記

class TestのコンストラクタをexplicitにするとVCではコンパイルエラーになります。

explicit Test() : Test(123) { /* 中身は変更なし */ }
explicit Test(const char* pMsg) : Test(123, pMsg) { /* 中身は変更なし */ }
explicit Test(int val, const char* pMsg = "data") : data_(val), msg_(pMsg) { /* 中身は変更なし */ }

error C2664: 'Test::Test(const Test &)' : cannot convert parameter 2 from 'int' to 'const Test &'
error C2660: 'Test::Test' : function does not take 2 arguments

なぜダメなの?