有没有办法避免在初始化字符串时从clang-tidy(紫红色默认参数)发出此警告?

Urm*_*hah 6 c++ clang-tidy

考虑这段代码:

#include <iostream>

int main () { 
  std::string str = "not default";
  std::cout << str << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行clang-tidy -checks=* string.cpp给出以下内容:

7800 warnings generated.
/tmp/clang_tidy_bug/string.cpp:4:21: warning: calling a function that uses a default argument is disallowed [fuchsia-default-arguments]
  std::string str = "not default";
                    ^
/../lib64/gcc/x86_64-pc-linux-gnu/8.1.1/../../../../include/c++/8.1.1/bits/basic_string.h:509:39: note: default parameter was declared here
      basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
                                      ^
Suppressed 7799 warnings (7799 in non-user code).
Run Code Online (Sandbox Code Playgroud)

还有其他可以通过的论点可以使此警告消失吗?我在这里实际上没有使用任何参数默认值。但是std :: string的实现确实可以。

编辑:更改代码以简化测试用例。

eer*_*ika 5

我在这里实际上没有使用任何参数默认值。但是std :: string的实现确实可以。

字符串类定义了默认参数。但是通过调用构造函数使用了默认参数,而没有显式传递第二个参数。

还有其他可以通过的论点可以使此警告消失吗?

是。如果您显式传递所有参数(包括默认参数),则不会使用默认参数发出警告。在这种情况下,您需要传递的参数是字符串构造函数的第二个参数,如警告消息所指出的那样。它是字符串的分配器。它具有类型std::allocator<char>

请注意,为了在复制初始化表达式中传递多个参数,您需要使用braced-init-list:

std::string str = {
    "actually not default",
    std::allocator<char>(),
};
Run Code Online (Sandbox Code Playgroud)

也就是说,使用默认参数通常不被认为是一种不好的做法,可以通过保留使用并禁用警告来改善您的生活。但是,是否如此,主要取决于意见。奇怪的是,警告名称和文档都暗示该警告是针对紫红色代码库的,而紫红色文档却明确允许使用默认参数(但建议使用“判断”)。

  • 只是为了在讨论中添加一点:起初我认为这个检查过于迂腐,但默认参数似乎可能会出现一些问题。另一方面,上面建议的代码也不可取。我刚刚检查过,如果我使用 std::string_view 代替,则检查似乎不会被触发(这里没有分配器)。因此,如果适用不同的类型,这可能是另一种选择。 (2认同)