c++ - 方法返回值地址

标签 c++ function memory-address

我有一个返回值的 get 方法:

int Foo::getValue() const
{
    return value_;
}

我正在使用以下代码将此值写入二进制文件:

void Bar::write(const Foo& foo)
{
    /* some code... */

    file_.write(reinterpret_cast<char*>(&foo.getValue()), sizeof(int));
}

而且看起来一切正常。但我不确定 &foo.getValue() 这件事。它总是返回一个getValue()返回值的地址还是有什么陷阱?

EDIT1:我不想为此创建一个临时变量。

EDIT2:是的,它可以编译并且工作正常。

EDIT3: write 是一个 ostream::write

EDIT4:对于/Wall 和/Za,它不会编译:错误 C2102:“&”需要左值

最佳答案

标准禁止你获取右值的地址:https://stackoverflow.com/a/28459180/2642059不符合标准的编译器可能会允许这种行为,但可以肯定的是,这不是跨平台的行为,也不能保证即使在更新可能更接近 C++ 标准的编译器之间也能成功。

由于您不是为特定编译器编程,而是为 C++ 编程,因此寻找在特定编译器中工作的东西不应该是您的目标。最好在标准内找到一种方法来实现这一点。

几个简单的选择是:

  1. 通过将其分配给临时值将其变成左值。他们是免费的!编译器会立即优化它们
  2. getValue 的返回更改为 const int& 这将允许您使用左值。由于 int 通常按值复制,这​​可能不会对您的代码库产生影响,但它可能会
  3. 创建另一个可以直接返回(const char*)&value_的方法,滥用这个方法可能会遇到麻烦,所以要小心

关于c++ - 方法返回值地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34401888/

相关文章:

c++ - 如何在 QMainWindow 中设置多个标志?

c++ - 使用 constexpr 函数的斐波那契数列(编译时与运行时)

c++ - 嵌套类 C++ 静态内部方法(Xml 解析并尝试用值填充 vector )

c# - 在内部函数中调用方法 c#

c - C指针的操作方法

c++ - 用 printf 打印一个字符

c - C中void函数的return语句

c# - MemorySharp 设置偏移地址不起作用

c++ - 如何在 C++ 中打印已定义常量的内存地址

c++ - C++ 中更宽松的抛出说明符