我有一个struct InferValueType
可以隐式转换为包括引用类型在内的任何其他类型。我使用以下代码完成此操作。
struct InferValueType {
// ...
template <typename Type>
operator Type() const && {
// ...
}
// We need this special version to allow conversions to reference types
template <typename Type>
operator Type&() const & {
// ...
}
};
InferValueType
用户从不实例化,而是将其作为函数的返回值提供。
const InferValueType read();
InferValueType
和的组合read
允许用户像这样编写惰性代码:
int i = read();
MyType t1 = read();
MyType& t2 = read();
const MyType& t3 = read();
我已经针对 GCC 4.8、4.9、5、6 和 Clang 3.7 和 3.8 对此进行了测试。只有 GCC 4.8 抱怨歧义。
conversion from ‘const InferValueType’ to ‘int’ is ambiguous
conversion from ‘const InferValueType’ to ‘MyType’ is ambiguous
我认为这是因为int
andMyType
可以分别使用const int&
and来构造const MyType&
。
问题:这是 4.9.2 之前的 GCC 的特性还是实际上是 C++11 下的歧义?
完整的例子在这里。