我正在尝试使用返回类型
const MyClass * const
。但是,我收到警告:
警告:#815-D:返回类型上的类型限定符毫无意义。
这不是有效类型吗?我想要一个不能更改的指针,并且我希望它指向的东西也不能被更改。
指针本身具有值类型,因此将其设置为 const 没有意义。调用函数对返回值执行的操作不受被调用函数的限制。这类似于尝试定义类似的东西:
const int getInt();
getInt(),在这种情况下,只返回一个 int 值(而不是引用)。它进入寄存器,然后调用者函数接收它并用它做任何它想做的事。
我同意 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();
const int f() {
...
}
f() 返回的值是一个副本 - 更改它不会改变任何内容,因此将其设置为 const 没有任何意义。
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
这应该有助于确保你的返回类型不再毫无意义:)
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 编译器告诉您指针的常量性是一致的无意义——指针无论如何都不能被赋值。但对于类/结构,显然可以分配给非常量返回值。