В C++ можно определить переменную х из класса X, который имеет конструктор, которые требуют аргументов, используя различные обозначения:предупреждения ЦУСА «набор переменного, но не используется» с использованием различных конструкторов списков инициализатора
X x{...}; // modern style (1)
X x = {...}; // slightly more verbose modern style (2)
X x = X{...}; // verbose modern style (3)
X x(...); // old '98 style (4)
X x = X(...); // verbose old '98 style (5)
Если объект х в дальнейшем не используется GCC выпуски предупреждение:
variable ‘x’ set but not used
только в случаях (2), (3) и (5) где = используется, но не в случаях (1) и (4) ,
Не следует ли предупреждать также в этих случаях?
Я использую GCC версии 6.1.1 20160511 с -Wall -Wextra -Wpedantic -std = С ++ 14 под Linux
я попытался для дальнейшего исследования также лязг компилятором. Интересно, что clang вызывает предупреждение только для случаев (3) и (5), но не для других. См. https://godbolt.org/g/qW712c
Я также попытался сравнить выход сборки из 5 различных версий. Код сборки байт для байтов идентичен для всех 5 версий, и это верно как для gcc, так и для clang.
[Невозможно воспроизвести (1)] (http://coliru.stacked-crooked.com/a/5564a34842148d15) (другое предупреждающее сообщение, но w/e); (4) является объявлением функции. –
Я ошибочно пропустил точки для указания наличия аргументов между фигурными скобками, отредактировал. Я могу воспроизвести (1): http://coliru.stacked-crooked.com/a/32bc35e547853868 – disquisitiones
Я могу только представить, что это так, что такие вещи, как 'std :: unique_lock guard (mutex);' (или любой другой охранник -подобная конструкция) не выдает предупреждения. –
evan