我试图将 T 类型的 x 传递给foo
期望的函数,unsigned int
但我不确定 T 是什么,因为它是在其他模块中声明的 typedef。两者都不是我可以修改的foo
。T
如果发生缩小,我希望编译器警告我。所以我正在尝试:
typedef int T;
void foo(unsigned int x);
void bar(){
T x;
foo(unsigned int{x});
}
不幸的是,在 gcc 9.2 上。这给了我一个编译错误:
<source>: In function 'void bar()':
<source>:5:9: error: expected primary-expression before 'unsigned'
foo(unsigned int{x});
^~~~~~~~
Compiler returned: 1
如果我将违规行更改为:
foo((unsigned int){x});
然后问题就消失了,我得到了一个正确的警告,表明发生了缩小:
<source>: In function 'void bar()':
<source>:5:25: warning: narrowing conversion of 'x' from 'T {aka int}' to 'unsigned int' inside { } [-Wnarrowing]
foo((unsigned int){x});
^
Compiler returned: 0
伟大的!不幸的是,这种语法在 Visual Studio 2019 16.2.5 上不起作用,因为我得到:E0029 C4576 C2397 错误在这一行。其中 C4576 是“带括号的类型后跟初始化列表是一种非标准的显式类型转换语法”。
那么这种情况下的标准显式类型转换语法是什么? https://en.cppreference.com/w/cpp/language/explicit_cast在第 5 点)说它必须是单字类型。如果超过一个字(long long、unsigned long int 等)怎么办?