这是错误的警告吗?

xry*_*669 4 c++ templates warnings design-patterns initialization

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

struct Foo
{
    template <typename T>
    T* as1() { /* ... */ }

    template <typename T>
    T* as2(T*) { /* ... */ }  
};   
Run Code Online (Sandbox Code Playgroud)

前一种方法是这样使用的:

    SomeComplexTypeAndNotAuto * a = foo.as1<SomeComplexTypeAndNotAuto>();
Run Code Online (Sandbox Code Playgroud)

而后者使用起来更方便,因为您不需要重复复杂类型:

    SomeComplexTypeAndNotAuto * a = foo.as2(a); 
Run Code Online (Sandbox Code Playgroud)

但是,大多数编译器会通过 Wuninitialized 警告拒绝第二种情况:

warning: variable 'a' is uninitialized when used within its own initialization [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)

很明显,变量没有在初始化中使用,只有它的类型。有没有办法在不处理每个编译器 pragma 的地狱的情况下避免此警告?

编辑:

从我最初的帖子中不清楚,但是当我写 时SomeComplexTypeNotAuto,我的意思是这样的代码: auto a = foo.as2(a);无法解析,因为您必须提供一种类型以允许编译器推断它。

我的问题是特定于 methodas2()是一个模板这一事实,因此必须在 type 的专业化时间可见T。因此编译器可以看到该参数T*甚至没有名称,因此它不能在函数内使用/可用。因此,我不明白为什么它会警告“未使用的变量”警告,因为很明显它没有被使用。

eer*_*ika 6

很明显,变量没有在初始化中使用

相反,这是很清楚该变量是在函数参数的初始化中。程序的行为是未定义的。

这是错误的警告吗?

不,警告是正确的。


一个简单的解决方法是将参数更改为引用:

T* as2(T*&)
Run Code Online (Sandbox Code Playgroud)

只是要特别注意不要实际读取引用的值。

从 C+11 开始,您可以改用auto。