c++ - 这两种转换方式有区别吗?

标签 c++ templates

我必须处理一些我试图破译的高度模板化的代码。

我看到两种不同的结构,我不确定我是否遗漏了什么。这是一些地方使用的这些类型转换的简化示例,以下语句之间有区别吗?

template<typename T, typename S> S my_function(T t) 
{
    // version 1:
    S s = t
    return s;

    // version 2:
    return S(t);
 }

我正在考虑将所有内容更改为一种样式,这两个语句是否 100% 等效?如果不是,有什么区别?

最佳答案

不,它们不是 100% 等效的!

对于简单的情况(c++11 及更高版本),考虑类型为 class S 的 return 语句,那么区别是:

如果 Smove operators然后在返回值时使用它们,否则 copy operators被使用。另请注意,如果这些运算符是私有(private)的或已删除,则版本 1 将无法编译。

对于版本 2 s 创建(使用构造函数或用户定义的运算符)并由于 RVO 直接返回

现在对于复杂的情况,还有其他的事情要考虑;第一个版本使用 copy initialization第二个是 direct initialization .还有user defined operatorsexplicit可以改变行为的关键字。

关于c++ - 这两种转换方式有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48540924/

相关文章:

c++ - 为什么构造不完整类型的 std::unique_ptr 编译?

c++ - std::vector::erase() 不想 move

c++ - 这段 C++ CRTP 代码应该编译吗?如果可以,它应该做什么?

c++ - 如何确定是什么*真正*导致您的编译器错误

c++ - sizeof childclass 如何在父模板类中使用子类作为模板参数?

c++ - 如何判断 "->"运算符最终是否返回类型?

c++ - 如何在 C++ 模板类中为单个方法创建专门化?

c++ - 问题 : How to convert CString into const char * in C++ MFC

c++ - 如何正确地将 u8 字符串文字传递给接受 UTF-8 字符串的 C 函数

c++ - valgrind 改变二进制行为