方法

时间:2015-12-21 18:12:37

标签: 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));
}

似乎一切运作良好。但我不确定&amp; foo.getValue()的事情。它总是返回 getValue()的返回值的地址,还是有任何陷阱?

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

EDIT2:是的,它编译并正常运行。

EDIT3:写入是ostream :: write

EDIT4:使用/ Wall和/ Za无法编译:错误C2102:&#39;&amp;&#39;需要l值

2 个答案:

答案 0 :(得分:4)

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

由于您不是针对特定编译器编程,而是针对C ++编程,因此查找在特定编译器中工作的内容不应该是您的目标。寻找在标准内实现这一目标的方法将是更可取的。

这样做的几个简单选择是:

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

答案 1 :(得分:3)

Microsoft编译器无论出于什么原因都有一个“功能” - 它隐式地将临时转换为左值。您可以通过以下代码进行检查:

int &ref = foo.getValue();

这段代码以及你不应该编译。适当的代码是:

void Bar::write(const Foo& foo)
{
    /* some code... */
    int temp = foo.getValue();
    file_.write(static_cast<const char*>(&temp), sizeof(int));
}