読者です 読者をやめる 読者になる 読者になる

VS2013で破綻した型の名前を出力してたら{ctor}の文字が出てきた

タイトルで話が完結している

namespace minibug
{
	template<class ...T>
	struct List{};

	template<class...T>
	std::true_type length_impl(List<T...>);

	template<class T>
	struct wrap{ using type = T; };

	template<class T>
	using identity = typename wrap<T>::type;

	template<class list>
	using length = identity<decltype(length_impl(list{}))>;

	struct test
	{
		using type = length<List<char, int>>;
	};
}
int main() {
	using namespace minibug;
	std::cout << typeid(test::type::type::type).name();
}

実行結果は以下のようになった

?AVtest:type:type:{ctor}:

???
一般に"{ctor}"という文字が型名を出力してる時に出てくることはない
例えばhogeというクラスを作れば"hoge"となるし
この場合であれば"std::integral_constant"とか出力されるのが妥当であろう
{ctor}とはどう考えてもコンパイラ内部で用いられてるコンストラクタを表す名前である
当然typeidで出てくることは一般的にない。hoge::hoge()だって"hoge"と出力される

いったいどういう経緯でこれが表に出てきてしまったのかは不明だが、この型は間違いなく腐っている