对字符串c ++进行不明确的整数赋值

时间:2017-06-28 07:00:38

标签: c++ g++ implicit-conversion clang++ stdstring

所以,在玩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 = 97s是一个字符串,那么为什么要通过隐式转换为它分配一个整数呢?

  • 可以避免/停止此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,好吧,,但为什么要为允许的字符串赋值

2 个答案:

答案 0 :(得分:2)

  

不应basic_string& operator=( CharT ch );是explicit

它不可能,它不是构造函数或转换函数。

  

是否可以避免/停止此s = 97隐式转换?

不在您的代码中,因为它是定义良好的C ++。

答案 1 :(得分:2)

  

不应该basic_string& operator=( CharT ch );明确吗?那是,   为什么这样:s = 97允许? s是一个字符串,那么为什么要这样做   通过隐式转换为它分配整数?

来自explicit specifier

  

显式说明符指定构造函数或转换   函数(因为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 支持。