0

我有一个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

我认为这是因为intandMyType可以分别使用const int&and来构造const MyType&

问题:这是 4.9.2 之前的 GCC 的特性还是实际上是 C++11 下的歧义?

完整的例子在这里

4

0 回答 0