这是一个不正确的警告吗?

2024-05-04

让我们看看我经常看到的这个代码模式:

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(使用前将#替换为@)

这是一个不正确的警告吗? 的相关文章

随机推荐