我正在尝试使用返回类型const MyClass * const
。但是,我收到了警告:
警告:#815-D:返回类型的类型限定符无意义。
这不是有效类型吗?我想要一个无法改变的指针,我希望它指向的东西也不会改变。
答案 0 :(得分:22)
指针本身具有值类型,因此将其设为const是没有意义的。调用函数对返回值的作用不受被调用函数的限制。这类似于尝试定义类似:
const int getInt();
getInt(),在这种情况下,只返回一个int值(不是引用)。它转到一个寄存器,然后调用函数接收它并用它做任何想做的事。
答案 1 :(得分: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();
答案 2 :(得分:4)
为什么你关心指针是否改变了?这样做就像是说:
const int f() {
...
}
f()返回的值是一个副本 - 更改它不会改变任何内容,因此有一个nom点使它成为const。
答案 3 :(得分: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
这应该有助于确保您的返回类型永远不会毫无意义:)
答案 4 :(得分:0)
const限定符并不意味着什么,因为你正在返回一个指针
答案 5 :(得分:0)
为什么返回一个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);
没错,我刚刚分配到A
返回的临时operator+
。结果d.a
的值为4,而不是5.将operator+
的返回类型更改为const A
会阻止此赋值,从而导致表达式(a+b) = c
生成编译器错误。< / p>
如果我尝试分配一个从函数返回的指针或整数,我的编译器(MSVC)会生成一个“左操作数必须是l值”的错误,这似乎与ARM编译器一致,告诉你的常量指针没有意义 - 指针无论如何都无法分配。但是对于类/结构,显然可以分配给非const返回值。