在c类型的构造函数中强制转换

前端之家收集整理的这篇文章主要介绍了在c类型的构造函数中强制转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下c代码
#include <iostream>
#include <string>

    int main( int argc,char* argv[] )
    {
        const std::string s1 = "ddd";
        std::string s2( std::string( s1 ) );
        std::cout << s2 << std::endl;
    }

结果是:
1
为什么?
当我使用-Wall标志时,编译器写警告:’std :: string s2(std :: string)’的地址总是计算为’true’

但是这段代码

#include <iostream>
#include <string>

int main( int argc,char* argv[] )
{
    const std::string s1 = "ddd";
    std::string s2( ( std::string )( s1 ) );
    std::cout << s2 << std::endl;
}

结果:
DDD

这是正常的结果

解决方法

Most-vexing-parse.
std::string s2( std::string( s1 ) );

被解析为“使用名为s1的std :: string参数并返回std :: string”的函数的声明.然后尝试打印该函数,该函数首先将其转换为函数指针(正常衰减/转换规则).由于运算符<<对于函数指针,std :: ostream通常不会重载,它会尝试转换为bool,这会成功,并且由于函数指针是非空的,它将转换为布尔值true,打印为1. 将其更改为

std::string s2( (std::string( s1 )) );

或者甚至更好,只是

std::string s2( s1 );
原文链接:https://www.f2er.com/c/117347.html

猜你在找的C&C++相关文章