Есть ли способ избежать этого предупреждения от 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>(),
};

При этом использование аргументов по умолчанию обычно не считается плохой практикой, и вам, возможно, будет лучше, если вы сохраните использование и отключите предупреждение. Но так ли это, в основном основано на мнении. Как ни странно, и название предупреждения, и документация подразумевают, что предупреждение предназначено для кодовой базы фуксии, однако в документах фуксии явно разрешено использование аргументов по умолчанию (но предлагается использовать "суждение").

Другие вопросы по тегам