gpt4 book ai didi

c++ - 通过初始化列表实例化抽象类

转载 作者:IT老高 更新时间:2023-10-28 13:01:28 25 4
gpt4 key购买 nike

我想了解为什么编译器允许以下代码编译

#include <iostream>

struct A
{
A()
{
std::cout << "A::A\n";
}

virtual void f() const = 0;
};

void g(const A& a)
{
a.f();
}

int main()
{
g({});
}

它甚至在运行时输出 A::A

如果我用 g(A()) 替换 g({}) 它显然不会编译。它提示 A 是抽象的,不能被实例化。 Clang 和 GCC 都编译得很好,没有任何警告。当运行两个版本时打印 pure virtual method called 并终止。

最佳答案

这看起来像是一个已知的 g++ bug number 70939 :

creating object of abstract class allowed in all versions of g++

g++ compiles ill formed C++ program successfully

class A {
public:
A() {
printf("A()\n");
}
virtual void b() const = 0;
};
int main() {
const A& a{};
a.b();
return 0;
}

你的代码和这行代码做同样的事情

const A& a{}

作为 g({}) 调用的一部分。

关于c++ - 通过初始化列表实例化抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392541/

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