0

这篇文章中的参考支持参数部分,他们指出了参考的问题并提供了解决方案。我的问题是:他们为什么不首先将参数声明为引用?即,而不是:

const Parm parm_;

做:

Parm &parm_;
4

3 回答 3

0

它必须是

const Param &param_;

考虑到一般情况,然后你会在尝试减少或以其他方式修改参数时遇到同样的问题。另一种选择是创建更多的类来处理 const 和非 const 版本。

使用引用会阻止将表达式的结果用作参数,因为作为函数参数创建的临时引用会立即超出范围。

尽管他可以删除所有 const 并让它成为类型的一部分并且不允许表达式,但我认为要求 ByRef 帮助清晰仍然很有价值。

于 2011-05-08T15:11:31.583 回答
0

有一个问题:在 C++ 中,临时对象不能绑定到引用,而只能绑定到 const 引用。

因此,以下内容不能写:

int foo();

int& i = foo();

除非您使用允许它作为语言扩展的 Visual C++。

此外,如果我使用返回 const 引用的函数,那么它也不起作用。

这里没有简单的解决方案:)

至少在 C++0x lambda 被引入图片之前不会

于 2011-05-08T18:05:31.323 回答
0

因为引用的问题只是如何使用范围保护的一个例子。但它应该在所有其他情况下工作(并且正常工作)。所以有这个清理功能:

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 引用,那么这些示例在运行时将不会编译或崩溃。

于 2015-07-02T23:09:23.600 回答