4

我有一个这样的结构:

struct VrtxPros{
    long idx;
    std::vector<std::string> pros;
    VrtxPros(const long& _idx=-1, const std::string& val="") : idx(_idx)
    {
         if ( !val.empty() && val!="" )
             pros.push_back(val);
    }
};

后来在代码中我像这样使用它:

long idx = 1234;
VrtxPros vp( 2134, std::string("-1") );
if ( margin ) vp.pros[0] = idx;

编译器对此没有问题。我想知道,因为运营商应该提供参考。我找不到一个可以接受 long 的来源operator=std::string

为什么代码会编译?

4

2 回答 2

5

Astd::string可以分配给 a char,并且 along可以隐式转换为 a char,因此 astd::string可以分配给 a long。您的编译器可能会对这种隐式转换发出警告(如果您还没有看到,请调高警告级别,您会看到它)。

请参阅此处operator=列出的#4 。注意没有构造函数重载只需要一个字符,所以这种事情只能用于赋值。

就此而言,您也可以这样做:

std::string wow;
wow = 7ull; // implicit unsigned long long to char conversion
wow = 1.3f; // implicit float to char conversion
于 2012-07-20T20:44:55.473 回答
1

使用 -Wconversion for g++ 来获取从 long 到 char 的隐式转换的警告。

于 2012-07-20T20:50:21.913 回答