- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经询问过有关代码审查和软件工程的问题,但该主题不适合该网站,所以我在这里提问,希望这不是基于意见的。我是一名“守旧派”的 C++ 开发人员(我已经停止使用 C++ 2003),但现在我已经阅读了几本关于现代 C++ 11/17 的书籍,并且我正在重写我的一些库。
我做的第一件事是在需要的地方添加移动构造函数/赋值运算符(= 已经具有析构函数的类 + 复制构造函数和复制赋值)。基本上,我使用的是五规则。
我的大部分函数都是这样声明的
func(const std::string& s);
这是传递引用避免复制的常用方法。顺便说一句,还有新的移动语义,还有一些我在我的书/网上找不到的东西。这段代码:
void fun(std::string& x) {
x.append(" world");
std::cout << x;
}
int main()
{
std::string s{"Hello "};
fun(s);
}
也可以写成:
void fun(std::string&& x) {
x.append(" world");
std::cout << x;
}
int main()
{
std::string s{"Hello "};
fun(std::move(s));
//or fun("Hello ");
// or fun(std::string {"Hello" });
}
我的问题是:我什么时候应该声明接受作为右值引用的参数的函数?
我了解 && 语义在构造函数和赋值运算符上的用法,但不了解函数。在上面的例子中(第一个函数)我有一个 std::string& x
不能被调用为 fun("Hello ");
当然因为我应该删除类型作为 const std::string& x
。但是现在 const 不允许我更改字符串!
是的,我可以使用 const 强制转换,但我很少使用强制转换(即使是这样,它们也是动态强制转换)。 && 的强大之处在于我避免了复制,我不必做类似的事情
std::string x = "...";
fun(x); //void fun(std::string& x) {}
我可以评估将被移动的临时值。我应该尽可能声明带有右值引用的函数吗?
我有一个正在用现代 C++ 17 重写的库,我有如下函数:
//only const-ref
Type1 func(const type2& x);
Type3 function(const type4& x);
我在问是否值得将它们全部重写为
//const-ref AND rvalue reference
Type1 func(const type2& x);
Type3 function(const type4& x);
Type1 func(type2&& x);
Type3 function(type4&& x);
我不想创建太多可能无用的重载,但如果我的库的用户想要使用移动操作,我应该创建 && 参数类型。当然,我这样做不是针对原始类型(int、double、char...),而是针对容器或类。你有什么建议?
我不确定后一种情况(两个版本)是否有用。
最佳答案
让我评论一下您的问题和示例中的四种情况。
std::string_view
应该替换 const std::string&
参数,并且只要您可以保证安全使用的必要先决条件std::string_view
(生命周期,pointee 不变),它是开始现代化您的函数签名的好选择。const T&
与 T&&
(其中 T
不受模板类型推导的约束)与已知使用场景。附加到给定的可修改字符串的 void fun
函数只有在调用代码不需要之后的结果时才会作为 void fun(std::string&&)
有意义电话。在这种情况下,右值引用签名很好地记录了这种期望,并且是要走的路。但根据我的经验,这些情况很少见。const T&
与 T&&
(同样,没有类型推导)在未知的使用场景下。 std::vector::push_back
是一个很好的引用,它为右值和左值引用都重载了。与移动构造 a T
相比,push_back 操作被认为是廉价的,这就是重载有意义的原因。当假设一个函数比这样的移动构造更昂贵时,按值传递参数是一种有意义的简化(另请参阅 EMC++ 中的第 41 项)。const T&
与 T&&
当发生类型推导时。在这里,尽可能将通用引用与 std::forward
一起使用,并且参数不能是 const 限定的。如果它们未在函数体中修改,请使用 const T&
。关于c++ - 将右值引用实现为函数重载中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253572/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!