return 语句中临时 void 对象的值初始化

Fed*_*dor 6 c++ templates return void language-lawyer

如果我没记错的话,允许return void()在函数模板中编写以避免不必要的专业化和void类型重载。

同时,return void{}Clang 不识别类似的语法:

template<typename T>
T foo() { return T(); }

template<typename T>
T bar() { return T{}; }

int main() {
    // ok everywhere
    foo<void>();

    // error in Clang
    bar<void>();
}
Run Code Online (Sandbox Code Playgroud)

Clang 16 打印错误:

error: illegal initializer type 'void'
Run Code Online (Sandbox Code Playgroud)

在线演示: https: //gcc.godbolt.org/z/6o89reK3G

cppreference中,我没有找到答案:对于非聚合类型T(), 和T{}应该表现相同。并且没有关于void类型的特殊注释。

这只是一个 Clang bug,还是相反,它是唯一严格遵循标准的编译器?

duc*_*uck 5

这是CWG2351,显然尚未在 Clang 中实现。

void()void{}是等价的。