有人可以在这里描述返回类型上到底发生了什么吗
返回类型是对指向常量Mystruct
对象的常量指针的引用。
以及为什么它不适用于 Mac Release 版本。
您忘记显示 的声明Mystruct
,但我猜它是声明为的成员:
Mystruct* m_pObject;
请注意,没有const
,使其成为const Mystruct*
函数返回引用的不同指针类型。
在这种情况下,您试图返回对错误指针类型的引用:const Mystruct*
而不是Mystruct*
. 为了返回正确的类型,函数必须创建一个 type 的临时指针const Mystruct*
。但是,在返回对临时对象的引用后,它会超出范围并可能被垃圾覆盖:使用返回值会产生未定义的行为。
要修复它,请按值返回指针:
const Mystruct* GetMyObject() const {return m_pObject;}
您可能还需要一个非常量的重载,以避免需要狡猾的铸造:
Mystruct* GetMyObject() {return m_pObject;}
更新:
为了证明这确实是问题所在(假设我猜测 的类型是正确的m_pObject
),请考虑以下内容:
#include <iostream>
struct Mystruct {};
struct Test {
Test() : m_pObject(0) {}
const Mystruct * const & GetMyObject() const {
return m_pObject;
}
Mystruct * m_pObject;
};
int main() {
Test test;
std::cout << "MEMBER: " << &test.m_pObject << std::endl;
std::cout << "RETURN: " << &test.GetMyObject() << std::endl;
}
编译器识别问题:
$ g++ test.cpp
test.cpp: In member function ‘const Mystruct* const& Test::GetMyObject() const’:
test.cpp:9:16: warning: returning reference to temporary [enabled by default]
并运行它表明返回的引用不引用该成员:
$ ./a.out
MEMBER: 0x7fff7a3c4c20
RETURN: 0x7fff7a3c4c08