为什么将临时对象作为参数传递需要std :: move?

时间:2019-04-01 21:31:19

标签: c++

我正在尝试通过初始化列表将字符串文字数组传递给仅接受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"}));

海湾合作委员会停止抱怨。为什么?

1 个答案:

答案 0 :(得分:3)

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

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