return 方法值的地址
Address of return value of method
我有一个 return 值的获取方法:
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() 事情。它总是 return return 的地址 getValue() 的值还是有任何陷阱?
EDIT1:我不想为此创建临时变量。
EDIT2: 是的,它编译并且工作正常。
EDIT3: 写的是 ostream::write
EDIT4: 使用 /Wall 和 /Za 将无法编译:错误 C2102:“&”需要左值
标准禁止您获取右值的地址:不符合标准的编译器可能允许这种行为,但可以肯定的是,这不是跨平台的行为,也不能保证即使在编译器的更新之间也能成功,使其更符合 C++ 标准。
由于您不是为特定编译器编程,而是为 C++ 编程,所以寻找在特定编译器中工作的东西不应该是您的 objective。最好在标准中找到一种方法来实现这一点。
几个简单的选择是:
- 通过将其分配给临时值将其变成左值。他们是免费的!编译器会立即优化它们
- 将
getValue
的 return 更改为 const int&
这将允许您使用左值。由于 int
通常按值复制,这可能不会对您的代码库产生影响,但它可能
- 创建另一个可以直接 return
(const char*)&value_
的方法,但滥用这个方法可能会遇到麻烦,所以要小心
Microsoft 编译器出于某种原因有一个 `"feature" - 它隐式地将临时值转换为左值。您可以通过以下代码查看:
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));
}
我有一个 return 值的获取方法:
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() 事情。它总是 return return 的地址 getValue() 的值还是有任何陷阱?
EDIT1:我不想为此创建临时变量。
EDIT2: 是的,它编译并且工作正常。
EDIT3: 写的是 ostream::write
EDIT4: 使用 /Wall 和 /Za 将无法编译:错误 C2102:“&”需要左值
标准禁止您获取右值的地址:
由于您不是为特定编译器编程,而是为 C++ 编程,所以寻找在特定编译器中工作的东西不应该是您的 objective。最好在标准中找到一种方法来实现这一点。
几个简单的选择是:
- 通过将其分配给临时值将其变成左值。他们是免费的!编译器会立即优化它们
- 将
getValue
的 return 更改为const int&
这将允许您使用左值。由于int
通常按值复制,这可能不会对您的代码库产生影响,但它可能 - 创建另一个可以直接 return
(const char*)&value_
的方法,但滥用这个方法可能会遇到麻烦,所以要小心
Microsoft 编译器出于某种原因有一个 `"feature" - 它隐式地将临时值转换为左值。您可以通过以下代码查看:
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));
}