gpt4 book ai didi

c++ - 按值接受临时值和按引用接受非临时值的模板函数?

转载 作者:太空狗 更新时间:2023-10-29 20:43:24 25 4
gpt4 key购买 nike

我想拥有

template <class T>
void foo(T &t);

也能够接受临时对象,而不影响通过引用接受其他对象并在其上调用非常量方法。在 C++03 中可能吗?

我意识到我可能会强制用户将其对象的所有方法声明为 const,并将所有成员声明为 mutable,然后使用 const T &t 引用,但这是一个丑陋的解决方法。

最佳答案

在 C++03 中,无法推断传递给函数的参数是左值还是右值。

我想这就是为什么你的问题的标题说“按值接受临时值”的原因:如果存在这样的机制,你可以创建一个函数(模板)来确定参数类型应该是 T&T ,基于该信息。

这正是 C++11 支持的类型推导机制所做的:

template<typename T>
void foo(T&& t);
// ^^^
// lvalue of type A is passed: T = A&, signature = foo(A& t)
// rvalue of type A is passed: T = A, signature = foo(A&& t)

但如上所述,这在 C++03 中是不可能的,因为它缺少一种确定表达式值类别的方法。

您提到的可能性(强制所有对象都具有 const 成员函数)不是解决方法(甚至不是一个丑陋的方法):如果成员函数都是 const , 表示 foo()不需要改变其输入的状态。这反过来意味着它可能需要 const& , 问题就解决了。

您可能打算制作那些 const成员函数执行 const_cast<>为了改变对象的状态,但是你可以再次在 foo() 中使用相同的内容.这是一个坏主意的原因是在这两种情况下你都不能输入 foo()。类型为 const 的对象-合格,你可能不知道是不是这样。

关于c++ - 按值接受临时值和按引用接受非临时值的模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15415530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com