以下は正常に動作します(予想どおり):
struct X {};
struct A
{
operator X const& ()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
しかし、これはあまり明確ではありません:
template<typename T>
struct X {};
struct A
{
template<typename T>
operator X<T> const& ()
{
static const X<T> value{};
return value;
}
};
int main()
{
A a;
X<int> x = a;
}
GCC 4.9 は言ってerror: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
いますが、clang 3.4 には問題はありません。変換関数からまたはを削除しconst
たり、記述したりすると、GCC も満足します。&
X<int> const &x = a
const &
そのため、ターゲット タイプがテンプレート クラスでありconst &
、そのクラスの非オブジェクトへの変換を要求した場合にのみ、GCC は変換関数を見つけることができません。これは正しい動作ですか?私は標準を読もうとしましたが、オーバーロードの規則は私にとって非常に混乱しています。