警告 C4180: 应用于函数类型的限定符没有意义;已被忽略。

4
我已经设置编译器选项 /Za 来禁用语言扩展,以便编译器使用严格的ISO C++标准。以下是一个示例接口类,我收到了以下警告:

警告C4180:对函数类型应用的限定符没有意义;已忽略

这个警告是关于函数返回类型中的const限定符的,如果我去掉const,则警告消失,但我不想这样做,也不想开启语言扩展。我的问题是:这个警告是否合理?如果不是,那么我将使用#pragma来禁用该警告,但在此之前,我想确保这个警告是“虚假警报”。
因为以下类是正确的ANSI ISO C++,是吗?所以警告应该被禁用?
    class IBet
    {
    public:
        IBet() { };
        virtual ~IBet() = 0 { };
        virtual const float parentChips() const = 0; // Warning C4180
        virtual const short parentChilds() const = 0; // Warning C4180
            // ...
    };

警告是有效的,因为将按值返回类型指定为“const”没有意义。我不确定它是否是有效的ANSI C ++。 - Oliver Charlesworth
3
修改标题,使其易于在SO和其他搜索引擎中进行搜索。 - iammilind
您是在暗示这个警告是由/Za引起的。如果您删除该开关,它是否会真正消失? - user180326
"但是我不想这么做" -- 为什么不呢?你认为 const 添加了什么? - user743382
@jdv-Jan 如果我重新启用语言扩展,它就会消失...感谢hvd,也感谢David的解释,现在我更好地理解了这个问题。 - codekiddy
1个回答

7
两个函数的返回值被声明为const。由于它是按值传递的,所以没有任何意义。你可以删除那个const,因为它完全没有作用。

编译器很少需要拒绝代码,几乎所有情况下C++需要诊断的地方都足以发出警告。 - user743382
1
我认为这个警告很好。移除 const 将会提高代码质量。代码的读者将能够专注于重要的内容,而不会被多余的 const 分散注意力。 - David Heffernan
@hvd:你能提供一个在语言上是正确的,但需要进行诊断的例子吗? - David Rodríguez - dribeas
@DavidHeffernan:我看到有人建议在返回值为值的情况下始终使用const,以捕获一些(荒谬的)边角情况,例如:obj.getX().change(5);getX返回临时对象的情况下,该语句没有效果,并似乎表明代码存在问题。再次强调,我不太相信这种用例,但我认为应该对正确潜在不需要的结构使用警告。我想不出任何一个额外的const可能会导致问题的情况。 - David Rodríguez - dribeas
@DavidRodríguez-dribeas 我不能这样做,我也不认为有这种情况(我也没有声称有这种情况)。我的意思是,即使对于明显的错误,例如 void f() { return 3; },虽然标准要求进行诊断,但标准并不要求它是一个错误。编译器可以在其最严格的符合模式下发出警告,并继续接受代码。 - user743382
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接