c++ 为什么编译器警告返回类型上的const没有意义?

cwdobuhd  于 6个月前  发布在  其他
关注(0)|答案(6)|浏览(84)

此问题在此处已有答案

Does it make sense to return fundamental types by const value?(11个回答)
4个月前关闭。
我尝试使用const MyClass * const的返回类型。但是,我得到一个警告:
警告:#815-D:返回类型上的类型限定符没有意义。
这不是一个有效的类型吗?我想要一个不能被改变的指针,我希望它指向的东西也不能被改变。

hiz5n14c

hiz5n14c1#

指针本身具有值类型,因此使其成为常量没有意义。调用者函数对返回值的操作不能受到被调用函数的限制。这类似于试图定义如下内容:

const int getInt();

字符串
在本例中,getInt()只是返回一个int值(而不是引用)。它进入一个寄存器,然后调用函数接收它并对它做任何它想做的事情。

s3fp2yjn

s3fp2yjn2#

我同意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();

9rnv2umw

9rnv2umw3#

为什么要关心指针是否被更改?这样做就像在说:

const int f() {
   ...
}

字符串
f()返回的值是一个拷贝--改变它什么也不会改变,所以让它成为常量没有意义。

xghobddn

xghobddn4#

一个简单的方法来确保你定义的是你想要的返回类型,就是总是在原始类型的右边(而不是左边)添加修饰符。

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

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

ryoqjall

ryoqjall5#

const限定符没有任何意义,因为你返回的是一个指针

mnowg1ta

mnowg1ta6#

为什么要返回一个const值?考虑以下情况(请原谅缺乏想象力的变量名):

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);


没错,我只是将operator+返回的临时值A赋值给d.a,结果d.a的值是4,而不是5。将operator+的返回类型更改为const A会阻止这种赋值,导致表达式(a+b) = c生成编译器错误。
如果我试图赋值给一个从函数返回的指针或整数,我的编译器(MSVC)会生成一个“左操作数必须是l值”错误,这似乎与ARM编译器告诉你指针的常量是没有意义的一致-指针无论如何都不能被赋值。但是对于类/结构,显然可以赋值给非常量返回值。

相关问题