所以,在玩C ++时,我做到了这一点:
#include <iostream>
int main() {
std::string s{"someThing"};
std::cout << " s is: " << s << '\n';
s = 97;
std::cout << " s is: " << s << '\n';
return 0;
}
当我使用g ++编译它时,它编译完全,并且在运行其输出时是:
s is: someThing
s is: a
但我怀疑为什么编译正确?
然后我发现了这个解决这个问题的问题:
Why does C++ allow an integer to be assigned to a string?
然后我从C ++ documentation:
中找到了这个basic_string& operator=( CharT ch );
所以,我的主要问题是:
basic_string& operator=( CharT ch );
不应该explicit ?也就是说,为什么允许s = 97
? s
是一个字符串,那么为什么要通过隐式转换为它分配一个整数呢?
可以避免/停止此s = 97
隐式转换吗?
并且,有些方面的问题:这个代码与g ++完美编译,但没有与clang一起编译,它报告了这个错误:
error: expected ';' at end of declaration
std::string s{"someThing"};
^
那么,为什么g ++能够编译这个并且clang不能?
编辑:感谢Edgar Rokyan,现在它使用-std=c++11
选项编译clang ++。
编辑:那么,根据 Edgar Rokyan 和 MSalters 的答案,assignment operator can't be made explicit
,好吧,,但为什么要为允许的字符串赋值
答案 0 :(得分:2)
不应
basic_string& operator=( CharT ch )
;是explicit
?
它不可能,它不是构造函数或转换函数。
是否可以避免/停止此
s = 97
隐式转换?
不在您的代码中,因为它是定义良好的C ++。
答案 1 :(得分:2)
不应该
basic_string& operator=( CharT ch );
明确吗?那是, 为什么这样:s = 97
允许?s
是一个字符串,那么为什么要这样做 通过隐式转换为它分配整数?
显式说明符指定构造函数或转换 函数(因为C ++ 11)不允许隐式转换或 副本初始化。它可能只出现在decl-specifier-seq中 在其类定义中声明此类函数。
因此,您无法使赋值运算符显式化。
是否可以避免/停止此
s = 97
隐式转换?
一般来说,不,因为它对于 std :: string 来说是完全合法的。当你打电话:
basic_string& operator=( CharT ch );
使用97
,然后将97
的 int 类型转换为char
并执行 operator = 。< / p>
那么,为什么g ++能够编译这个并且clang没有?
最有可能的是,您尝试使用 clang 编译程序而不使用 C ++ 11 支持。