是unsigned char('0')合法的C++

qaz*_*qaz 7 c++

以下在Visual Studio中编译但无法在g ++下编译.

int main()
{
    int a = unsigned char('0');
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

unsigned char()是一种在C++中强制转换的有效方法吗?

GMa*_*ckG 11

不,这不合法.

函数式显式类型转换需要一个简单类型说明符,后跟一个带括号的表达式列表.(§5.2.3)unsigned char一个简单型说明符 ; 这与詹姆斯提出的问题有关.

显然,如果unsigned char是一个简单类型说明符,那将是合法的.解决方法是使用std::identity:

template <typename T>
struct identity
{
    typedef T type;
};
Run Code Online (Sandbox Code Playgroud)

然后:

int a = std::identity<unsigned char>::type('0');
Run Code Online (Sandbox Code Playgroud)

std::identity<unsigned char>::type是一个简单类型说明符,它的类型只是模板参数的类型.

当然,你得到一个二合一static_cast.无论如何,这是首选的铸造方法.

  • 我不明白对这个答案的反对意见.问题似乎是关于功能风格的演员.答案正确而简明地解释了为什么这个特定的演员是非标准的,参考标准术语,并解释了如何在保留代码结构的同时使其成为标准. (3认同)
  • @Neil:要在函数式演员表中执行它,这就是问题所在.他想知道为什么使用`unsigned char`的函数式转换不起作用; 告诉他做别的事不能回答他的问题.而且,它与空间没有任何关系; `identity`解决方案有空格. (2认同)

whe*_*ies 5

在C++中首选的方法是使用static_cast如下:

int a = static_cast<unsigned char>( '0' );
Run Code Online (Sandbox Code Playgroud)