我有一个返回值的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值
答案 0 :(得分:4)
标准禁止你获取右值的地址:https://stackoverflow.com/a/28459180/2642059不符合标准的编译器可能允许这种行为,但可以肯定的是,这不是跨平台的行为,也不能保证成功即使在编译器的更新之间,也可能更接近于它与C ++标准。
由于您不是针对特定编译器编程,而是针对C ++编程,因此查找在特定编译器中工作的内容不应该是您的目标。寻找在标准内实现这一目标的方法将是更可取的。
这样做的几个简单选择是:
getValue
的回报更改为const int&
,这样您就可以使用左值。由于int
通常是按值复制的,因此这可能不会对您的代码库产生影响,但可能(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));
}