具有错误输入默认值的构造函数在 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 中不会引发错误的主要内容,如果未能解决你的问题,请参考以下文章