gpt4 book ai didi

c++ - 条件运算符 + upcast + const 引用

转载 作者:可可西里 更新时间:2023-11-01 15:23:01 25 4
gpt4 key购买 nike

灵感来自 this question ,我尝试了以下代码:

struct A {
virtual void doit() const = 0;
};

struct B : public A {
virtual void doit() const;
};

struct C : public A {
virtual void doit() const;
};

void
foo(bool p)
{
const A &a = (p ? static_cast<const A &>(B()) : static_cast<const A &>(C()));
a.doit();
}

Every compiler I have tried使用 -Wall -Werror 接受此代码并生成我想要的程序集。但是在仔细阅读了 C++03 规范第 12.2 节(“临时对象”)和第 5.12 节(“条件运算符”)后,我不确定这是否保证有效。

那么,这段代码是有效的,还是调用了未定义的行为? C++03 和 C++11 的答案是否不同?

引用相关规范将不胜感激。

最佳答案

哦,很无效。

考虑:

#include <iostream>
using namespace std;

struct A {
virtual ~A() { cout << "~A" << endl; }
virtual void doit() const = 0;
};

struct B : public A
{
~B() override { cout << "~B" << endl; }
void doit() const override { cout << "A::doit" << endl; }
};

struct C : public A
{
~C() override { cout << "~C" << endl; }
virtual void doit() const { cout << "C::doit" << endl; }
};

void foo(bool p)
{
cout << "foo( " << p << ")" << endl;
const A &a = (p ? static_cast<const A &>(B()) : static_cast<const A &>(C()));
a.doit();
}

auto main( int argc, char* argv[] ) -> int
{
cout << boolalpha;

foo( true );
cout << endl;
foo( false );
}

输出 Coliru Viewer , 使用 g++ 4.8:

foo( true)~B~Apure virtual method calledterminate called without an active exceptionbash: line 7: 16922 Aborted                 (core dumped) ./a.out

这是 UB,所以任何解释都可能是正确的,但可以合理地确定,无需查看程序集,发生的情况是:

  • 临时搭建。
  • 它绑定(bind)到引用。
    这是绑定(bind)到引用的引用,因此不涉及创建新的临时文件或切片。
  • 临时文件被销毁。
  • 作为其中的一部分,它的动态类型(vtable 指针)被更改为抽象的 A
  • 调用了A中的纯虚。

关于c++ - 条件运算符 + upcast + const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com