C++ 为什么要警告默认参数?

C++ 为什么要警告默认参数?,c++,c++17,C++,C++17,在C++17中使用ReSharper,我启用了许多警告,只是为了查看我的项目对我的警告。我明白了: Declaring a parameter with a default argument is disallowed[fuchsia-default-arguments] 所讨论的代码是构造函数: class Point2D { public: explicit Point2D(double x = 0.0, double y = 0.0); }; 我想知道为什么默认参数会被认为是坏

在C++17中使用ReSharper,我启用了许多警告,只是为了查看我的项目对我的警告。我明白了:

Declaring a parameter with a default argument is disallowed[fuchsia-default-arguments]
所讨论的代码是构造函数:

class Point2D
{
public:
    explicit Point2D(double x = 0.0, double y = 0.0);
};
我想知道为什么默认参数会被认为是坏的/糟糕的/值得警告的?有人有任何代码示例证明这是一个可行的警告吗


在函数参数的默认参数方面,有几种奇怪的情况

以下是CppCon 2017的演示,详细介绍了许多棘手的行为

总结要点:

  • 重新声明会导致潜在的混乱行为
  • 虚拟函数调用中使用的默认参数不是由调用的函数决定的,而是由静态类型决定的
  • 函数模板上的默认参数可能看起来格式不正确,但只要它们没有实例化,就可以编译

当然,对于非模板构造函数,它们是相当无害的。它不能被重写或重新声明(尽管一个越界的定义可能会给您带来麻烦)。

我对ReSharper了解不多,但您似乎已经启用了clang tidy的fuschia-*检查系列。该项目的编码约定必须反对使用默认参数,这并不意味着它们通常是不合适的。@Praetorian,耶,我只是想把它们关掉。我只是好奇我自己的理解,为什么一个团队会发现这是糟糕的。非常感谢。相关:我不赞成这一点,但有些人认为编写一组重载函数比编写一个带有默认参数的函数要好。建议删除c++17标记,因为在该版本的标准中此行为没有改变。