具有错误输入默认值的构造函数在 GCC 7 中不会引发错误

Posted

技术标签:

【中文标题】具有错误输入默认值的构造函数在 GCC 7 中不会引发错误【英文标题】:Constructor with mis-typed default value raises no error with GCC 7 【发布时间】:2018-05-11 20:11:53 【问题描述】:

在下面的代码中,变量定义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 编译代码时,我得到一个错误。

我认为该行在B 的构造函数中使用参数n 的默认值。

n 的默认值为A(),不能转换为int

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

哇。这是一些错误。

以上是关于具有错误输入默认值的构造函数在 GCC 7 中不会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

具有聚合初始化的 C++11 构造函数委托

具有默认值的外键上的 Django 1.7 迁移错误

显式默认构造函数

GCC 错误 - 在 constexpr 中输入/递减数组访问

如何在构造函数中初始化具有相同值的对象数组

在 C++ 中创建具有 2 个双精度值的类