Есть ли способ избежать этого предупреждения от clang-tidy (fuchsia-default-arguments) при инициализации строки?
Рассмотрим этот кусок кода:
#include <iostream>
int main () {
std::string str = "not default";
std::cout << str << std::endl;
return 0;
}
Бег 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).
Есть ли какой-то другой аргумент, который можно передать, чтобы убрать это предупреждение? Я не использую никаких аргументов по умолчанию здесь. Но реализация std:: string делает.
Изменить: Изменен код, чтобы упростить тестовый пример.
1 ответ
Я не использую никаких аргументов по умолчанию здесь. Но реализация std::string делает.
Класс string определил аргумент по умолчанию. Но вы использовали аргумент по умолчанию, вызвав конструктор без явной передачи второго аргумента.
Есть ли какой-то другой аргумент, который можно передать, чтобы убрать это предупреждение?
Да. Если вы передадите все аргументы явно (включая значения по умолчанию), то ничто не предупредит об использовании аргументов по умолчанию †. Аргумент, который вам нужно передать в этом случае, является вторым аргументом строкового конструктора, на что указывает предупреждающее сообщение. Это распределитель для строки. Имеет тип std::allocator<char>
,
Обратите внимание, что для того, чтобы передать более одного аргумента в выражении инициализации копирования, вам нужно использовать список фигурных скобок:
std::string str = {
"actually not default",
std::allocator<char>(),
};
При этом использование аргументов по умолчанию обычно не считается плохой практикой, и вам, возможно, будет лучше, если вы сохраните использование и отключите предупреждение. Но так ли это, в основном основано на мнении. Как ни странно, и название предупреждения, и документация подразумевают, что предупреждение предназначено для кодовой базы фуксии, однако в документах фуксии явно разрешено использование аргументов по умолчанию (но предлагается использовать "суждение").