Тестовый код:
struct X {
X (int x) {}
};
int main() {
X x1(0); // nothing!
X x2 = 0; // warning: unused variable
X x3 = X(0); // warning: unused variable
}
Вопрос
Почему не генерируется предупреждение для x1
?
Примечания:
-
Я компилирую с помощью опции
-Wall
. -
Оба GCC и Clang производят эквивалентный вывод.
-
Эти 3 строки генерируют одни и те же инструкции ассемблера (для ясности помещены некоторые
asm("nop")
):nop lea -0x8(%rbp),%rdi mov $0x0,%esi callq 400600 <X::X(int)> nop lea -0x10(%rbp),%rdi mov $0x0,%esi callq 400600 <X::X(int)> nop lea -0x18(%rbp),%rdi mov $0x0,%esi callq 400600 <X::X(int)> nop
-
Это не происходит с примитивными типами (например,
typedef int X
). -
Если причина связана с тем, что в конструкторе могут быть побочные эффекты, тогда возникает вопрос: почему я получаю два других предупреждения?
Edit:
- Это не дубликат этого вопроса IMO, поскольку в этом случае конструктор нетривиальный.