gpt4 book ai didi

c++ - 这是错误的警告吗?

转载 作者:行者123 更新时间:2023-12-01 14:03:38 26 4
gpt4 key购买 nike

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

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]

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

编辑:

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

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

最佳答案

It's quite clear the variable is not used in the initialization



相反,很明显该变量用于函数参数的初始化。程序的行为是未定义的。

Is this an incorrect warning?



不,警告是正确的。

一个简单的解决方法是将参数更改为引用:
T* as2(T*&)

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

从 C+11 开始,你可以使用 auto然而。

关于c++ - 这是错误的警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60830000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com