Clang拒绝gcc和msvc接受的继承方案

Ala*_*lan 5 c++ templates language-lawyer

我了解了 C++ 中的继承。然后为了检查我是否正确理解了这个概念,我编写了下面给出的程序,该程序被 clang 拒绝,但被 gcc 和 msvc 接受。现场演示

#include <array>
#include <iostream>
class Base
{
private: 
    int data;
public:
    Base(int pdata):data(pdata) {}
    Base(const Base&){std::cout <<" Copy base";}

};

class Derived : public Base
{ 
    
};
 
int main()
{
    Derived d(1); //rejected by clang but accepted by gcc and msvc
} 
Run Code Online (Sandbox Code Playgroud)

我正在使用 C++20,想知道C++20 中哪个编译器是正确的。我还注意到,对于 C++17,所有编译器都拒绝这一点,但从 c++20 开始,gcc 和 msvc 开始编译程序。看来 c++20 标准发生了一些变化。但我不知道这个变化是什么(假设有任何这样的变化)以及程序在 c++20 中是否格式良好。

clang c++20 错误说:

<source>:19:12: error: no matching conversion for functional-style cast from 'int' to 'Derived'
    Base d(Derived(1));
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 0

该代码是有效的 C++20,但并非所有编译器都支持所有 C++20 功能。您遇到了 Clang 尚不具备的功能(带括号的初始化)。

每个新的 C++ 标准都会发生这种情况。标准发布的那一年,支持似乎就几乎完成了,但有一些缺失的部分可能需要几年的时间才能出现(如果有的话)。