在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都是如此。
答案 0 :(得分:0)
构造函数可能有副作用。 如果是这种情况,则未使用的变量不应该是错误。编译器不可能知道构造函数是否有副作用,因此不会产生错误。
2,3,5是不同的,因为它们是构造和分配。