gpt4 book ai didi

c++ - 为什么在这里调用 move 构造函数?

转载 作者:IT老高 更新时间:2023-10-28 22:26:56 26 4
gpt4 key购买 nike

这是一个 C++ 测验的代码示例:

#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};

X f(X a) {
return a;
}

X g(const char * b) {
X c(b);
return c;
}

int main() {
f("hello");
g("hello");
}

程序的输出是什么?

我是这样想的:

  1. f(X a)被调用,构造函数将const char*隐式转换为X,所以输出为1<
  2. 由于我们没有对象来存储返回值,所以返回值被丢弃,没有输出
  3. g(const char*) 被调用,X c(b) X(const char*) 输出是 1
  4. 返回值被丢弃一次 - 无输出

所以答案是 11。测验的答案是 131。我用 g++ 4.4.4-13 得到的答案是 121。

据说这段代码是用这个命令编译的:

g++ -std=c++11 -Wall -Wextra -O -pthread

中间的数字从何而来?为什么它可以是 3 或 2?

最佳答案

理论上,这可以打印 1311331313131331 中的任何一个。作为一个测验问题非常愚蠢。

  • f("hello");:

    • “hello”通过转换构造函数转换为临时的X,打印出1
    • 临时X用于初始化函数参数,调用 move 构造函数,打印3。这可以省略。
    • x用于初始化临时返回值,调用move构造函数,打印3。它是一个函数参数,因此不允许省略,但返回是一个隐式 move 。
  • g("hello");

    • “hello”用于通过转换构造函数构造c,打印出1
    • c用于初始化临时返回值,调用move构造函数,打印3。这可以省略。

请记住,函数总是必须构造它们返回的东西,即使它只是被调用代码丢弃。

至于打印2,那是因为您使用的古老编译器没有实现implicit-move-when-returning-a-local-variable 规则。

关于c++ - 为什么在这里调用 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31958643/

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