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

dch*_*ric 7 c++

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

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

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

在GCC中不编译。错误是:

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

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

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

    foo(std::move(argType{"a","b"}));
Run Code Online (Sandbox Code Playgroud)

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

M.M*_*M.M 4

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

所以我认为这是一个 gcc bug。