让我们看看这个我经常看到的代码模式:
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*甚至没有名称,因此它不能在函数内使用/可用。因此,我不明白为什么它会警告“未使用的变量”警告,因为很明显它没有被使用。