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

标签 c++ c++11 abstract-class language-lawyer

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

#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/

相关文章:

c++ - 将 double 类型传递给 ceil 会导致 GCC 中不同优化级别的不同值

c++ - 如何从 std::map::emplace() 获取对插入对象的引用?

c++ - 检查类型是否可散列

C++11 静态转换为右值引用

c++ - NSight 中的 CUDA 架构 -sm_11 编译问题

c++ - Debug模式下的 xcode 链接器错误(重复符号)

c++ - 在 std::function 原型(prototype)中使用 'this' 指针

java - Android fragment 类访问抽象方法的类组织

java - 在java中实现接口(interface)和抽象类中都存在的方法

ruby-on-rails - 当它的父类(super class)是抽象的时,为什么 rails 不尊重与 STI 相关联的对象的类型?