用类型推断声明变量是否与在变量名后用括号初始化变量的 "classical way" 一样有效?
Is declaring variable with type inference as effective as "classical way" of initializing variable with parenthesis after variable name?
如果能够在我的代码库中轻松地进行文本搜索以查找调用某个对象的构造函数的位置,那就太好了。下面是模式。而不是经典:
Object val( a, b );
到处使用就好了:
auto val = Object( a, b );
这样我就可以使用简单的文本搜索 "Object("
并获取我调用 Object
的构造函数的位置的列表。它在语法上的歧义也更少,因此更容易制作简单的工具来自动执行某些代码转换。它也优雅地避免了 "most vexing parse" 问题。
我唯一担心的是对性能的可能影响。情况 2) 是否与情况 1) 一样快? (如果我们可以假设 Object
已经正确定义了移动构造函数和移动赋值运算符,并且启用了基本的编译器优化。)
Pre C++17,虽然不太可能,但您可能会因额外的复制或移动而导致性能下降。甚至 C++98 也允许实现删除此类副本,即使它们会产生副作用,而且几乎所有编译器都已经实现了这种优化很长时间——尤其是在优化构建中。
Post C++-17,保证复制省略。你甚至不需要复制或移动构造函数来工作,所以你不应该看到任何区别。
如果能够在我的代码库中轻松地进行文本搜索以查找调用某个对象的构造函数的位置,那就太好了。下面是模式。而不是经典:
Object val( a, b );
到处使用就好了:
auto val = Object( a, b );
这样我就可以使用简单的文本搜索 "Object("
并获取我调用 Object
的构造函数的位置的列表。它在语法上的歧义也更少,因此更容易制作简单的工具来自动执行某些代码转换。它也优雅地避免了 "most vexing parse" 问题。
我唯一担心的是对性能的可能影响。情况 2) 是否与情况 1) 一样快? (如果我们可以假设 Object
已经正确定义了移动构造函数和移动赋值运算符,并且启用了基本的编译器优化。)
Pre C++17,虽然不太可能,但您可能会因额外的复制或移动而导致性能下降。甚至 C++98 也允许实现删除此类副本,即使它们会产生副作用,而且几乎所有编译器都已经实现了这种优化很长时间——尤其是在优化构建中。
Post C++-17,保证复制省略。你甚至不需要复制或移动构造函数来工作,所以你不应该看到任何区别。