如果代码使用“隐式布尔转换”。有效的c ++ 03代码可以在c ++ 11中中断吗?

一个学习者

随着c ++ 11中的变化

更改:更改:在现有的布尔转换运算符中指定显式使用(https://timsong-cpp.github.io/cppwp/n4618/diff.cpp03.input.output

有效的c ++ 03代码可以在c ++ 11中中断吗?

struct abt {

        public:

        abt(int a, double b){}

         abt(int a){cout<<"int"<<endl;}

        abt(bool b) {cout<<"bool"<<endl;}

       abt(bool b,bool c) {cout<<"bool bool"<<endl;}

       operator bool() const { return true; } };

     int main() {

    abt is("a",3);
    if (is)
        std::cout << "success";
    if( is == true)
        std::cout << "success";

    return 0;
}

此有效的c ++ 03代码在c ++ 11中给出相同的输出,具有隐式布尔转换的输出在c ++ 11中也相同。规则有什么错吗?

maximum_prime_is_463035818

即使您abt只进行显式转换if(is),在C ++ 11中也可以,因为an的条件if是显式转换是“隐式”的上下文。来自cppreference

在以下上下文中,如果声明bool t(e);的格式正确(即explicit T::operator bool() const;考虑了诸如之类的显式转换函数,则将预期使用bool类型并执行隐式转换据说这种表达e在上下文中转换为bool

  • 的控制表达ifwhilefor;
  • ...

C ++ 11中发生的变化是,许多隐式转换为标准类型的布尔转换为显式转换。例如std::istream::operator bool

operator void*() const;                 (1)     (until C++11)
explicit operator bool() const;         (2)     (since C++11)

总是错误的代码,但是以前编译过的代码现在将无法编译,这很好。例如:

#include <iostream>

void foo(bool){}

int main()
{
    foo(std::cout);
}

现场演示

另一方面,如果您这样编写代码,并且隐式转换是有意的,那么您的代码将在C ++ 11中中断。


TL; DR:

这不是的重大变化if(is)如果现在还不错,那还不错(is您的自定义类型是转换为bool标准类型还是标准类型,并且无论转换是否显式)。如果您过分依赖标准类型的隐式转换,则可能会遇到一两个惊喜。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++代码在C ++ 03和C ++ 11中都可以有效,但是做不同的事情吗?

可以在roxygen2代码块内使用换行符吗?

C#代码仅在使用调试器时有效吗?

在psake版本中为C#6.0代码库强制MSBuild 14.0

添加唯一代码以在c中的函数的开始和结束

Visual Studio 2017的“实现接口”命令可以生成C#5代码吗?

为什么C ++隐式转换有效,但显式的无效?

是否可以仅针对某些特定的C ++ 11代码段来{activate | de-activate} SIGFPE生成?

是否可以在Xcode 7中编译Swift 2代码并在iOS 11.1 iPhone 6上运行它?

在C11中指向匿名联合的指针强制转换有效吗?

工作C ++ 03代码上的G ++(C ++ 14)链接器错误

如何解决不受支持的C ++ 11代码

有人可以使用C#统一代码在我的测验游戏中为我提供帮助吗

是否可以将UTF-8代码转换为R中的正确字符?

如何将C ++ 11代码编译为Webassembly?

尝试将C ++ 11代码转换为C ++ 03时默认函数模板参数出错

内部链接规则可以破坏c ++ 11中的有效c ++ 03代码吗?

如何在C#9代码生成器中获取ctor参数的类型?

首先在哪里可以找到Entity Framework 4.0代码中的.csdl,.ssdl和.msl文件?

我可以在没有图形卡或MESA的计算机上编程/编译OpenGL 4.0代码吗?

我如何在没有增强的情况下将C ++ 11代码转换为C ++ 98?

AVX计算问题:我可以运行avx2代码吗?

C打印f。这是有效的代码吗?

使用Visual Studio 2013编译C ++ 11代码

我可以单独使用VS2013单步执行VB6代码吗?

我可以/应该在cordova应用程序中下载html5代码吗?

我可以使用C#预处理器跳过Kinect v2.0代码吗?

我可以将Realm.getDefaultInstance()。executeTransaction([transaction])称为“单一代码”吗?

标准库中的 c++ 代码都是有效的 c++ 吗?