gpt4 book ai didi

c++ - 如何在不允许临时创建的情况下编写 const ref

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:28 25 4
gpt4 key购买 nike

我希望能够提供通过常量引用获取给定类型的现有对象的函数。

即我想要按常量引用但不创建临时文件。 [编辑这句话以澄清它!]

我想不出有什么方法可以直接用 C++ 表达:

1 void fn(const T & t)
如果存在(非显式)T(S),将从 S 创建一个临时的 T

2 void fn(T & t)
将只允许非 const t 作为参数(我需要它也适用于 const t)。

3 void fn(T && t)
需要一个非常量 rvalue

4 void fn(const T && t)
需要一个const rvalue

有什么方法可以做到这一点 - 通过引用接受任何参数,const,而不允许创建临时文件?


失败的想法:

在不提供其他两个的情况下提供 #2 和 #4,现在我们有一个明确的 fn,它引用任何现有的 T(但不会默默地生成一个临时的)?

不,这也不够,因为我还需要能够绑定(bind)到 const T & - 目标对象本身通过 const 引用传递给我们的调用者。 ..


我想除了我可以控制 T 以确保它不提供隐式 T(S) 的情况外,我看不出有什么办法可以做到这一点。

我是对的,还是我忽略了一些解决方案?

最佳答案

从评论来看,您的实际问题似乎与右值和左值无关,而只是防止隐式转换。您可以通过将函数更改为函数模板,然后使用 sfinae 约束模板来完成此操作:

template <class T, std::enable_if_t<std::is_same<std::decay_t<T>, CString>::value, int> = 0>
void fn(const T&) {

}

这仅在使用某种 CString 调用时有效,隐式转换为 CString 的类型将无效。

实例:http://coliru.stacked-crooked.com/a/80602c39cdc4d35e

也就是说,更好的解决方案是简单地更改这些函数以接受 string_view,它可以从各种字符串隐式构造,成本低廉。我不知道它是否处理 CString 或不,但你总是可以纠正你自己的。这是一个相当简单的类。 http://en.cppreference.com/w/cpp/string/basic_string_view

关于c++ - 如何在不允许临时创建的情况下编写 const ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122048/

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