c++ - 默认值输入错误的构造函数不会引发 GCC 7 错误

标签 c++ gcc constructor c++17

在下面的代码中,变量定义B<int, int>(14);应该是错误的:

#include <iostream>

struct A {
};

template<class T, class R=A>
class B {
public:
    explicit B(const int s, R n = A()) { 
        std::cout << "c\n"; 
    }
};

template <class T, class R=A>
void foo(const int s, R nx = A()) {};

int main() {
    B<int, int>(14);
    // foo<int, int>(14);
    // error: could not convert ‘A()’ from ‘A’ to ‘int’
}

为什么没有编译错误?

compiled gcc 7.3 和 g++ -std=c++17 的代码

当我用 gcc 7.3 和 g++ -std=c++14 编译代码时, 我得到一个错误。

我认为该行使用参数的默认值 nB 的构造函数中.

默认值nA() , 不可转换为 int .

我应该得到一个编译错误。但事实并非如此。

函数的类似情况(由 foo 测试)会导致编译错误。

最佳答案

你遇到了GCC bug #83020 . Clang 6 和 GCC 8(以及 GCC 6)正确拒绝您的示例代码,C++14 模式下的 GCC 7 也是如此。

关于c++ - 默认值输入错误的构造函数不会引发 GCC 7 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50299607/

相关文章:

c++ - 为什么 gdb 不能显示调试信息?

Javascript动态选择构造函数,这是不正确的吗?

c# - 是否可以将泛型类型限制为接口(interface)、new()?

c++ - 使成员函数静态化会使程序无法编译。不知道为什么

c++ - 处理大型字符串/数组?

c++ - 定义新的内存类型

ubuntu - Linux 中的库格式错误

c++ - 如何在单独的 Linux 和 Windows 计算机上使用代码块开发 C++ 项目?

java - 在具有指定容量的构造函数中初始化 linkedList 大小的最佳选项是什么?

c++ - 来自 TrackBar 的 WM_VSCROLL/WM_HSCROLL 消息不会发送到子类 MessageHandler。为什么?