当前位置: 首页 > 知识库问答 >
问题:

不同编译器调用的不同转换运算符

方奕
2023-03-14

考虑下面这个简短的C++程序:

#include <iostream>

class B {
public:
    operator bool() const {
        return false;
    }
};

class B2 : public B {
public:
    operator int() {
        return 5;
    }
};

int main() {
    B2 b;
    std::cout << std::boolalpha << (bool)b << std::endl;
}

如果我在不同的编译器上编译它,我会得到不同的结果。对于CLANG3.4和GCC 4.4.7,它打印true,而Visual Studio 2013打印false,这意味着它们在(bool)b调用不同的强制转换操作符。根据标准,哪一个是正确的行为?

根据我的理解,操作符bool()不需要转换,而操作符int()需要intbool的转换,因此编译器应该选择第一个。const对此做了什么吗?const-conversion是否被编译器认为更“昂贵”?

如果删除常量,所有编译器都会同样地生成false作为输出。另一方面,如果我将这两个类组合在一起(两个运算符都在同一个类中),所有三个编译器都将产生true输出。

共有1个答案

夹谷宜民
2023-03-14

该标准规定:

派生类中的转换函数不会隐藏基类中的转换函数,除非两个函数转换为相同的类型。

§12.3[class.conv]

对于一些发明的临时变量t,声明t t(e);格式良好。

§5.2.9[Expr.Static.Cast]

因此,int可以转换为boolbool同样可以转换为bool

因此,重载集由运算符int运算符bool组成。在其他条件相同的情况下,运算符int是一个更好的匹配(因为您不必添加Constance)。因此,应该选择运算符int

请注意(也许违背直觉),一旦这些运算符被添加到重载集(如上所述),标准就不考虑返回类型(即这些运算符转换到的类型),前提是其中一个运算符的参数的转换序列优于另一个运算符的参数的转换序列(由于稳定性,在本例中就是这样)。

该标准规定:

    null

在本例中,只有一个参数(隐式this参数)。B2&=>B2&(用于调用运算符int)的转换序列优于B2&=>常量B2&(用于调用运算符bool),因此,从重载集中选择运算符int并不直接转换为bool

 类似资料:
  • 问题内容: 我正在编译glibc库。在我可以这样做之前,我需要先跑步。但是,要编译glibc,我需要使用gcc编译器,它不是计算机上的默认编译器。该手册说明以下内容。 现在,我的问题是我对该计算机没有任何管理权限。因此,如何使用不同于默认值的编译器。 问题答案: 在linux上,任何人都可以更改其进程的环境变量。不需要管理权限。 在bash中: 在csh中使用 在该命令之后在此shell中启动的任

  • 上面的代码使用不同的编译器会有不同的结果。这是编译器的错误还是我漏掉了什么? 叮叮当当 1 1 (https://godbolt.org/z/s43T55rxq) msvc 1 1 (https://godbolt.org/z/YnKfKh41q) 全球循环 0 1 (https://godbolt.org/z/91xdfv93c)

  • 现在,我有下面的代码,它只是测试标准库中的< code>std::set_difference: 当我用Clang/GCC编译它时,我得到了输出: 更新我想实际使用的源代码案例(假设是我将要做的一些操作。因此,这些操作将按的顺序发生): 好吧,这看起来不错,它实际上对应于标准::set_difference,检查链接:但是当我选择MSVC时,我得到了不同的输出(检查链接:https://godbo

  • Java语言规范第3.10.2点规定,浮点值按照IEEE 754标准的规定进行转换。对于strtod,C标准规定了函数如何将文本转换为浮点值。关于陈述本身,两者似乎涵盖了相同的案例。我不确定的是,舍入规则怎么样?Java编译器所做的转换与strtod所做的不同吗? 背景是,我想编译Java字节码代码,因此需要转换类文件中表示的浮点/双重值的文本表示。 例如,此Java代码打印更精确的值: 使用st

  • 问题内容: 给定相同的主要版本,例如Java 7,不同的Java编译器(例如Oracle的热点,JRockit或IBM的J9等)是否将给定的Java源代码文件编译为相同的bytcode? 扫描Java 7语言规范 ,似乎正在讨论的是语言的语义,而不是代码到字节码的转换。 YES 。 以上摘录为: JLS留下了许多实现细节,因一个实现而异。 和 但是,JLS没有指定从源代码到生成的字节码的1:1映射

  • 给我一个字符串,需要返回字符串中唯一字母的数量,大写和小写字母被认为相等,但你不能用小写转换它们,反之亦然。我试过很多东西。这是我能编的最好的代码:例如:“cd$ad”将返回3