在这篇文章中的参考支持参数部分,他们指出了参考的问题并提供了解决方案。我的问题是:他们为什么不首先将参数声明为引用?即,而不是:
const Parm parm_;
做:
Parm &parm_;
它必须是
const Param ¶m_;
考虑到一般情况,然后你会在尝试减少或以其他方式修改参数时遇到同样的问题。另一种选择是创建更多的类来处理 const 和非 const 版本。
使用引用会阻止将表达式的结果用作参数,因为作为函数参数创建的临时引用会立即超出范围。
尽管他可以删除所有 const 并让它成为类型的一部分并且不允许表达式,但我认为要求 ByRef 帮助清晰仍然很有价值。
有一个问题:在 C++ 中,临时对象不能绑定到引用,而只能绑定到 const 引用。
因此,以下内容不能写:
int foo();
int& i = foo();
除非您使用允许它作为语言扩展的 Visual C++。
此外,如果我使用返回 const 引用的函数,那么它也不起作用。
这里没有简单的解决方案:)
至少在 C++0x lambda 被引入图片之前不会。
因为引用的问题只是如何使用范围保护的一个例子。但它应该在所有其他情况下工作(并且正常工作)。所以有这个清理功能:
void my_exit(const std::string & msg)
{
std::cout << "my_exit: " << msg << std::endl;
}
这应该有效(传递临时对象):
void test()
{
std::string msg("test_1 Hello World");
ON_BLOCK_EXIT(&my_exit, msg.substr(0, 6));
}
这应该有效(传递对将在调用范围保护之前销毁的对象的引用):
void test()
{
std::map<int, std::string> m;
m[42] = "test_2";
ON_BLOCK_EXIT(my_exit, m[42]);
m.clear();
}
这应该有效(通过 const 引用):
void test(const std::string & msg)
{
ON_BLOCK_EXIT(&my_exit, msg);
}
如果parm
是 const 或非 const 引用,那么这些示例在运行时将不会编译或崩溃。