2016-09-05 5 views
-1

В 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

[Невозможно воспроизвести (1)] (http://coliru.stacked-crooked.com/a/5564a34842148d15) (другое предупреждающее сообщение, но w/e); (4) является объявлением функции. –

+0

Я ошибочно пропустил точки для указания наличия аргументов между фигурными скобками, отредактировал. Я могу воспроизвести (1): http://coliru.stacked-crooked.com/a/32bc35e547853868 – disquisitiones

+0

Я могу только представить, что это так, что такие вещи, как 'std :: unique_lock guard (mutex);' (или любой другой охранник -подобная конструкция) не выдает предупреждения. – evan

ответ

0

Конструктор может иметь побочный эффект. Если это случай, то неиспользованная переменная не должна быть ошибкой. Компилятор не может знать, имеет ли конструктор побочный эффект, поэтому он не будет создавать ошибок.

2, 3, 5 отличаются друг от друга, потому что они являются конструкцией и назначением.

+0

Но означает ли это, что в 2, 3, 5 существует конструкция временного объекта, а затем этот временный объект копируется в x, а в 1 и 4 - напрямую построена x? – disquisitiones

+0

Я не думаю, что копия на самом деле происходит, но семантическая система существует и g ++ предупреждает о неиспользуемой «назначенной» переменной (-Wunused-but-set-variable). – stream9

 Смежные вопросы

  • Нет связанных вопросов^_^