Почему clang выдает эти предупреждения?

Компилятор clang выдает предупреждения для приведенного ниже фрагмента, как это можно увидеть здесь.

clang++ -std=c++14 -O0 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:1:18: warning: braces around scalar initializer [-Wbraced-scalar-init]
void point(int = {1}, int = {2}) {}
                 ^~~
main.cpp:1:29: warning: braces around scalar initializer [-Wbraced-scalar-init]
void point(int = {1}, int = {2}) {}
                            ^~~

2 warnings generated.

Почему это?

void point(int = {1}, int = {2}) {}

int main(){
    point();
}

Насколько я могу судить, {1} и {2} являются вполне допустимыми аргументами по умолчанию согласно [ dcl.fct.default] / 1, [dcl.fct] / 3 и [dcl.init] / 1.


person João Afonso    schedule 24.05.2017    source источник
comment
Ну, это всего лишь предупреждение, ИМО, это просто означает, эй, это бесполезно и выглядит странно, вы уверены, что это то, что вы имели в виду?   -  person Quentin    schedule 24.05.2017
comment
@Quentin Поскольку это выглядит вполне допустимым кодом, предупреждений не должно быть.   -  person João Afonso    schedule 24.05.2017
comment
Есть много действительных фрагментов, которые вызывают предупреждения - неверный код вызывает ошибки. if(x = something()); - еще один.   -  person Quentin    schedule 24.05.2017
comment
@ JoãoAfonso, если это верно, но вводит в заблуждение (или опасно), компилятор может сгенерировать предупреждение (см. Вводящий в заблуждение отступ gcc предупреждение)   -  person nefas    schedule 24.05.2017
comment
@Quentin Но от clang нет предупреждений об этом int i = {1};   -  person João Afonso    schedule 24.05.2017
comment
Возможно, рассуждение может быть тем же, что и в этом ответе   -  person NathanOliver    schedule 24.05.2017
comment
@NathanOliver Больше нет. GCC не выдает предупреждения для int i = {1};.   -  person João Afonso    schedule 24.05.2017
comment
@ JoãoAfonso Может быть, у них тоже было это предупреждение, и когда они удалили его для нормальной инициализации переменной, они забыли сделать то же самое для аргументов по умолчанию.   -  person Barmar    schedule 30.05.2017
comment
comment
@ João Afonso: Поскольку это выглядит вполне допустимым кодом, предупреждений не должно быть - это довольно странная вещь. Предупреждения - это диагностические сообщения, которые обычно выдаются для совершенно правильного кода (правильно сформированного кода), который компилятор считает допустимым, но подозрительным. Неверный (неправильно сформированный) код обычно вызывает ошибки, а не предупреждения. Не каждый компилятор точно следует этому различию, но, тем не менее, идея именно в этом.   -  person AnT    schedule 15.06.2017


Ответы (1)


Скобки обычно используются при инициализации экземпляров структур, например:

struct example {
  int member1;
  int member2;
};

example x = { 1, 2 };

Clang сообщает вам, что использование фигурных скобок не является «нормальным» для инициализации одного значения. Это предупреждение может помочь, если вы не знакомы с синтаксисом для инициализации значений в C ++ или, возможно, если типы ранее были структурами до какого-либо рефакторинга.

Вы можете либо отказаться от использования фигурных скобок при инициализации целых чисел, либо передать компилятору флаг -Wno-braced-scalar-init, чтобы он не выводил предупреждение.

person Colen    schedule 15.06.2017