【问题标题】:Why does passing a temporary object as an argument need std::move?为什么将临时对象作为参数传递需要 std::move?
【发布时间】:2019-04-01 21:31:19
【问题描述】:

我正在尝试通过初始化列表将字符串文字数组传递给仅接受 const char** 的函数。示例代码如下:

// Example program 
void foo(const char **) { }

int main() {
    using argType = const char*[];
    foo(argType{"a","b"});
}

在 GCC 中无法编译。错误是:

在函数“int main()”中:6:25:错误:获取临时地址 数组

我知道这个参数是一个临时的,在执行这个foo(...) 语句后会被清除。但是为什么这种情况会被编译器认为是错误呢?

现在,如果我在两者之间添加std::move

    foo(std::move(argType{"a","b"}));

GCC 停止抱怨。为什么?

【问题讨论】:

  • 郑重声明,Clang 和 MSVC 不会抱怨这两个选项。
  • clang 和 icc 都接受并为两者生成相同的机器代码(启用优化和非空 foo)。所以... gcc 错误可能吗?

标签: c++


【解决方案1】:

代码正确; argType{"a","b"}const char *[2] (C++17 [expr.type.conv]/2) 类型的纯右值,数组到指针的转换可以应用于数组纯右值 ([conv.array]/1 ) 对prvalue执行临时实现,并且临时持续到完整表达式的末尾。

所以我认为这是一个 gcc 错误。

【讨论】:

  • 有趣的是expr.const.castcode sample 包含两个“OK”行,但gcc 和clang 都不接受任何行。
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多