零初始化的无名临时无符号整数。

4

我是否正确理解unsigned int{};的含义为在下列上下文中对一个无名的临时unsigned int进行零初始化?该示例在clang或gcc下无法工作,但在Visual Studio中可以编译通过:https://godbolt.org/z/LYWCCN

int ifun(int value) {
    return value * 10;
}

unsigned int uifun(unsigned int value) {
    return value * 10u;
}

int main() {
    // does not work in gcc and clang
    unsigned int{};
    unsigned int ui = uifun(unsigned int{});

    // works with all three compilers, also unsigned{}; works
    int{};
    int i = ifun(int{});
}

我明白这是一个理论问题;但是,对我来说似乎所有的用例(例如,将其用作初始化或函数参数,或者作为赋值语句中的右操作数,可能是为了实现所需的重载解析)都可以通过静态转换甚至隐式转换来解决,对吗? - undefined
2个回答

3
Clang和Gcc是正确的。 unsigned int {}; 首先被视为显式类型转换,只适用于单词类型名称;而 unsigned int (以及 int * 等)不是,但 int 是。
(强调是我的)

5)单词类型名称后跟一个大括号初始化列表是指定类型的prvalue,指定临时对象(直到C++17)其结果对象是(自C++17起)直接列表初始化使用指定的大括号初始化列表

作为解决方法,您可以
using unsigned_int = unsigned int;
unsigned_int{};

作为结果,它将按预期的方式对临时的unsigned int进行值初始化(零初始化)。

1
你确定使用(unsigned int){}吗?演示 - Jarod42
(unsigned int){} 是无效的,因为 {} 不是一个表达式。 - Rakete1111
(unsigned int){5}是什么呢? - undefined

2
你可以使用类型别名来解决这个限制。
using UI = unsigned int;
UI{};
UI ui = uifun(UI{});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接