C++ 11標準に従って、次のコードの正しい出力は何ですか?ユーザー定義の変換演算子を使用した関数テンプレートの過負荷解決
#include <iostream>
template <typename X>
class A
{
public:
A()
{
std::cout << "A::A" << std::endl;
}
A(const A<X>&)
{
std::cout << "A::A(const A<X>&)" << std::endl;
}
A<X>& operator = (const A<X>&)
{
std::cout << "A::opeartor =(conat A&)" << std::endl;
return *this;
}
};
void* GetData()
{
// return data based on some condition
static A<int> a;
return &a;
}
class P
{
public:
template <typename T>
operator T&()
{
void* pData = GetData();
std::cout << "P::operator T&()" << std::endl;
return *(reinterpret_cast<T*>(pData));
}
operator A<int>()
{
std::cout << "P::opeartor A<int>" << std::endl;
return A<int>();
}
};
int main(int /*argc*/, char** /*argv*/)
{
P objP;
A<int> objA = objP; // case 1
objA = objP; // case 2
return 0;
}
次の出力を出力します。
P::opeartor A<int>
A::A
A::A
P::operator T&()
A::opeartor =(conat A&)
VS2015は、次のように出力を生成します。
A::A
P::operator T&()
A::A(const A<X>&)
P::operator T&()
A::opeartor =(conat A&)
ケース1
VS2015は、gccと打ち鳴らすが、非テンプレートのバージョンを選ぶように、テンプレートのバージョンを選びます。
ケース2
すべての3つのコンパイラは、テンプレートのバージョンを選択します。
C++ 11標準を参照してこの動作をどのように説明できますか?
疑いがある場合は、VSが準拠していないとします。 :) – erip