所以,在玩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
但我的疑问是为什么正确编译?
然后我发现了这个SO问题,它解决了这个问题:
为什么C++允许将整数分配给字符串?
然后我从C++文档中找到了这个:
basic_string& operator=( CharT ch );
所以,我的主要问题是:
basic_string& operator=( CharT ch );
不应该明确吗?也就是说,为什么允许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
,好的,但是为什么允许将整数分配给字符串?
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=。
那么,为什么 g++ 可以编译它而 clang 没有呢?
最有可能的是,您尝试在没有C++11支持的情况下使用clang编译程序。
不应该
basic_string& operator=( CharT ch )
; 是explicit
?
它不可能,它不是构造函数或转换函数。
是否可以避免/停止这种
s = 97
隐式转换?
不在您的代码中,因为它是定义明确的C++。