让我们看看我经常看到的这个代码模式:
struct Foo
{
template <typename T>
T* as1() { /* ... */ }
template <typename T>
T* as2(T*) { /* ... */ }
};
前一种方法的使用方式如下:
SomeComplexTypeAndNotAuto * a = foo.as1<SomeComplexTypeAndNotAuto>();
而后者使用起来更方便,因为您不需要重复复杂的类型:
SomeComplexTypeAndNotAuto * a = foo.as2(a);
但是,大多数编译器会拒绝第二种情况并发出 Wuninitialized 警告:
warning: variable 'a' is uninitialized when used within its own initialization [-Wuninitialized]
很明显,初始化时没有使用该变量,仅使用其类型。有没有办法避免这个警告而不处理每个编译器编译指示的地狱?
Edit:
从我最初的帖子中还不清楚,但是当我写的时候SomeComplexTypeNotAuto
,我的意思是这样的代码:auto a = foo.as2(a);
无法解决,因为你have提供一种类型以允许编译器推断它。
我的问题是特定于该方法的事实as2()
是一个模板,因此在类型的专门化时必须可见T
。所以编译器可以看到参数T*
甚至没有名称,因此不能在函数内使用/使用它。因此,我不明白为什么它会警告“未使用的变量”警告,因为很明显它没有被使用。
很明显,初始化时没有使用该变量
相反,很明显,变量is用于函数参数的初始化。程序的行为是未定义的。
这是一个不正确的警告吗?
不,警告是正确的。
一个简单的解决方法是将参数更改为引用:
T* as2(T*&)
只是要格外确保不要实际读取参考值。
从 C+11 开始,您可以使用auto
相反,然而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)