0

我试图将 T 类型的 x 传递给foo期望的函数,unsigned int但我不确定 T 是什么,因为它是在其他模块中声明的 typedef。两者都不是我可以修改的fooT如果发生缩小,我希望编译器警告我。所以我正在尝试:

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 等)怎么办?

4

1 回答 1

3

在您的情况下,您可以只写unsigned而不是unsigned int. 但更通用的解决方案是创建一个类型别名:

void bar(T x) {
    using U = unsigned int;
    foo(U{x});
}
于 2019-11-14T17:02:56.210 回答