首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数时没有调用构造函数

调用函数时没有调用构造函数
EN

Stack Overflow用户
提问于 2017-12-15 19:30:41
回答 1查看 94关注 0票数 1

MyType同时定义了一个副本和一个移动ctor。在执行以下代码段时(在使用VS2015编译之后):

代码语言:javascript
复制
template<typename T>
void f(T&& o) {
    // do something with o
}

int main() {
    MyType o{ 1, 2, 3 };
    f(o); // call of copy-constructor expected
    f(std::move(o)); // call of move-constructor expected
}

我希望在f的第一次调用之后调用复制构造函数,在第二次调用f之后调用move构造函数。但在任何情况下,实际上都没有调用构造函数。我怀疑这种行为是编译器优化,但不确定可移植性或是否符合标准。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-15 19:40:23

这两个调用都是引用--第一个由lvalue引用,第二个由和rvalue引用。T&&可以同时处理这两种情况,被称为http://en.cppreference.com/w/cpp/language/reference (N4164)。Scott称它们为通用参考文献,并作为模板参数和auto&&特别有用。

std::move用于表示所有权转移,但实际上不进行任何移动。它的作用是static_cast对参考值的影响。

所以你有:

代码语言:javascript
复制
void f(MyType& ) {}
void f(MyType&& ) {}
...
f(o);                         // calls void f(MyType& )
f(static_cast<MyType&&>(o));  // calls void f(MyType&& )

当对象初始化时,通常会调用移动构造函数。

移动构造器 cppreference.com 每当重载解析选择移动构造函数时,都会调用该构造函数,这通常发生在从相同类型的rvalue (xvalue或prvalue) (直到C++17)xvalue (自C++17以来)初始化对象时(通过直接初始化或复制初始化),包括

  • 初始化:T a = std::move(b);T a(std::move(b));,其中b为T型;
  • 函数参数传递:f(std::move(a));,其中a为T类型,f为void f(T t);
  • 函数返回:return a;在函数(如T f() )中,其中有一个具有移动构造函数的类型为T的is。

如果您将f更改为void f(T o),则将为第一个调用调用复制构造函数,为第二个调用调用移动构造函数。

C++中的通用与转发引用

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47838804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档