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

时间:2011-10-21 17:26:40

标签: 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

这是正常的结果

1 个答案:

答案 0 :(得分:13)

Most-vexing-parse

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

被解析为“使用名为std::string的{​​{1}}参数并返回s1”的函数的声明。然后尝试打印该函数,该函数首先将其转换为函数指针(正常衰减/转换规则)。由于std::string的{​​{1}}一般不会为函数指针重载,它会尝试转换为bool,这会成功,并且因为函数指针是非空的,所以它被转换为布尔值{{ 1}},打印为operator<<

将其更改为

std::ostream

甚至更好,只是

true