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)
该代码是有效的 C++20,但并非所有编译器都支持所有 C++20 功能。您遇到了 Clang 尚不具备的功能(带括号的初始化)。
每个新的 C++ 标准都会发生这种情况。标准发布的那一年,支持似乎就几乎完成了,但有一些缺失的部分可能需要几年的时间才能出现(如果有的话)。