c++ - 类型转换运算符总是模棱两可

标签 c++ casting

考虑以下示例:

struct m
{
    m(int ) { }
};

class q
{
public:

    int i;

    q(int i)
    {
        this->i = i;
    }

    operator double()
    {
        return (double) i;
    }

    operator m()
    {
        return (m)i;
    }
};

int main()
{
    q x(1);
    (m)x; // error: ambiguous
}

当我调用转换时失败:从 qm 的转换不明确。为什么这样?我真的不明白。我明确地为 m 添加了一个转换运算符!为什么要模棱两可?但是,如果我删除对 double 的强制转换,这将起作用。为什么这很重要?我怎样才能做我想做的事?

最佳答案

考虑编译器在执行时可能采用的路径:

m temp__(x);

相关的构造函数有3个:

m(int );      // (A)
m(const m& ); // (B)
m(m&& );      // (C)

我们可以通过x --> double --> int调用(A),这是一个用户定义的转换序列。

我们可以通过x --> m调用(B)(C),这也是一个用户自定义的转换序列.

如果用户定义的转换序列最终调用相同的构造函数,那么它们只能优先于另一个。但在这种情况下,它们不会 - 因此编译器无法偏爱其中一个。因此,模棱两可。

你的替代方案是

  • 直接调用您的运算符(operator)(或使其成为具有某个名称的函数);或
  • 使 q 继承自 m - 派生到基础的转换将优于用户定义的转换序列;或
  • 使两个转换运算符都显式 - 在这种情况下,只有一个可行的候选开始,所以不会有歧义。

关于c++ - 类型转换运算符总是模棱两可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30695523/

相关文章:

c++ - 如何在 Visual Studio C++ 中的控制台中记录内容

c++ - 如何仅使用数学来旋转 16x16 位图数组的内容(无缩放,只需剪掉角)

c++ - C++ 中的默认函数参数必须保持不变吗?

c++ - 如何使用 std::array 模拟 C 数组初始化 "int arr[] = { e1, e2, e3, ... }"行为?

C++ 使用较新的编译器构建应用程序而无需重建库

C++ 非 const 到 const 转换编译错误

c - "Makes Pointer from Integer without a Cast"- 如何满足 GCC?

c++ - 带有 const 指针的 boost::dynamic_pointer_cast 不起作用?

arrays - DirectCast(或替代方案)将类型数组中的值作为第二个参数?

c++ - 用父类(super class)的实例覆盖子类的实例