gcc警告"变量集但未使用"使用不同的构造函数初始化列表

时间:2016-09-05 23:33:28

标签: c++ gcc constructor warnings initializer-list

在C ++中可以定义一个类X的变量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)  

如果后来没有使用对象x,gcc会发出警告:

variable ‘x’ set but not used  

仅适用于使用=的情况(2),(3)和(5),但不适用于情况(1)和(4)。
在这些情况下,是否也不应发出警告?

我在Linux下使用gcc版本6.1.1 20160511和 -Wall -Wextra -Wpedantic -std = c ++ 14

我还试图进一步调查clang编译器。有趣的是,clang仅针对案例(3)和(5)发出警告,但不针对其他案件发出警告。见https://godbolt.org/g/qW712c

我还试图比较5个不同版本的汇编输出。对于所有5个版本,汇编代码是字节到字节相同的,对于gcc和clang都是如此。

1 个答案:

答案 0 :(得分:0)

构造函数可能有副作用。 如果是这种情况,则未使用的变量不应该是错误。编译器不可能知道构造函数是否有副作用,因此不会产生错误。

2,3,5是不同的,因为它们是构造和分配。