为什么编译器会警告返回类型上的 const 没有意义? [重复]

问题描述 投票:0回答:6

我正在尝试使用返回类型

const MyClass * const
。但是,我收到警告:

警告:#815-D:返回类型上的类型限定符毫无意义。

这不是有效类型吗?我想要一个不能更改的指针,并且我希望它指向的东西也不能被更改。

c++ constants const-correctness
6个回答
23
投票

指针本身具有值类型,因此将其设置为 const 没有意义。调用函数对返回值执行的操作不受被调用函数的限制。这类似于尝试定义类似的东西:

const int getInt();

getInt(),在这种情况下,只返回一个 int 值(而不是引用)。它进入寄存器,然后调用者函数接收它并用它做任何它想做的事。


5
投票

我同意 Juliano 的回答,你希望指针的常量位于调用站点。

完成您正在寻找的任务的更好方法是让您的函数返回对该对象的 const 引用:

const MyClass& getMyClass()
{ 
  return myClass;
}

根据定义,引用不能被修改,所以你最好这样做。

当然,如果您的函数尝试“创建”MyClass 对象,则这将不起作用。在这种情况下,您可以将额外的 const 移至调用站点。 // function definition const MyClass* createMyClass() { return new MyClass("I Love C++"); } // use of a const pointer to a MyClass which is const const MyClass* const myClassInstance = creatMyClass();



4
投票

const int f() { ... }

f() 返回的值是一个副本 - 更改它不会改变任何内容,因此将其设置为 const 没有任何意义。


4
投票

MyClass // MyClass object MyClass const // MyClass object which can't be modified MyClass const & // reference of an unmodifiable MyClass object MyClass const * // pointer to an unmodifiable MyClass object MyClass const * const // unmodifiable pointer to an unmodifiable MyClass object MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object

这应该有助于确保你的返回类型不再毫无意义:)


0
投票


0
投票

struct A { int a; }; A operator+(const A& a1, const A& a2) { A a3 = { a1.a + a2.a }; return a3; }

鉴于
operator+

的声明,我可以执行以下操作:


A a = {2}, b = {3}, c = {4}, d = ((a+b) = c);

没错,我只是分配给了
A

返回的临时

operator+
d.a
的结果值为 4,而不是 5。将
operator+
的返回类型更改为
const A
可阻止此赋值,从而导致表达式
(a+b) = c
生成编译器错误。

如果我尝试分配给从函数返回的指针或整数,我的编译器(MSVC)会生成“左操作数必须是左值”错误,这似乎与 ARM 编译器告诉您指针的常量性是一致的无意义——指针无论如何都不能被赋值。但对于类/结构,显然可以分配给非常量返回值。

© www.soinside.com 2019 - 2024. All rights reserved.