加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 复杂的C样式类型转换表达式如何工作?

发布时间:2020-12-16 10:20:47 所属栏目:百科 来源:网络整理
导读:我正在寻找一种大写标准字符串的方法.我找到的答案包括以下代码: int main(){ // explicit cast needed to resolve ambiguity std::transform(myString.begin(),myString.end(),myString.begin(),(int(*)(int)) std::toupper)} 有人能解释一下铸造表达式“(
我正在寻找一种大写标准字符串的方法.我找到的答案包括以下代码:

int main()
{
    // explicit cast needed to resolve ambiguity
    std::transform(myString.begin(),myString.end(),myString.begin(),(int(*)(int)) std::toupper)
}

有人能解释一下铸造表达式“(int(*)(int))”吗?我发现的所有其他构建示例和描述仅使用简单类型转换表达式.

解决方法

正如其他人已经提到的,int(*)(int)是一个指向函数的类型指针,该函数接受并返回int.然而,这里缺少的是这个强制转换表达式的作用:与其他强制转换表达式不同,它不会真正转换(即它不会将值转换为不同的类型),但它从名为std :: toupper的重载函数集中选择一个具有签名int(int)的.

但请注意,此方法有点脆弱:如果由于某种原因没有匹配函数(例如因为没有包含相应的标题)而只有一个非匹配函数(因此不会出现歧义),那么这个强制转换表达式确实会变成一个演员,更确切地说是一个reinterpret_cast,具有不良影响.为了确保不会发生意外转换,应该使用C样式转换语法而不是C样式转换语法:static_cast< int(*)(int)>(std :: toupper)(实际上,在std的情况下) :: toupper这种情况不会发生,因为唯一的替代函数是模板化的,因此是模糊的,但是它可能发生在其他重载函数中).

巧合的是,在这种情况下,新式演员合成器更具可读性.

另一种可能没有任何演员表达的可能性如下:

int (*ptoupper)(int) = &std::toupper; // here the context provides the required type information
std::transform(myString.begin(),ptoupper);

请注意,上下文无法提供必要信息的原因是std :: transform在最后一个参数上被模板化,因此编译器无法确定要选择的正确函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读