对字符串 C++ 的模糊整数赋值

Ambigous integer assignment to string c++

因此,在使用 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 问题:

Why does C++ allow an integer to be assigned to a string?

然后我从 C++ 中找到了这个 documentation:

basic_string& operator=( CharT ch );

所以,我的主要问题是:

还有一些附带问题:这段代码用 g++ 编译得很好,但用 clang 编译得不好,它报告了这个错误:

error: expected ';' at end of declaration
std::string s{"someThing"};
                     ^

那么,为什么 g++ 可以编译它而 clang 不能?

编辑:感谢 Edgar Rokyan,现在它使用 clang++ 和 -std=c++11 选项进行编译。

编辑:因此,根据 Edgar RokyanMSaltersassignment operator can't be made explicit 的回答,好的,但为什么允许将整数分配给字符串

Shouldn't basic_string& operator=( CharT ch ); be explicit ?

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

Can this s = 97 implicit conversion be avoided/stopped?

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

Shouldn't basic_string& operator=( CharT ch ); be explicit ? That is, why is this : s = 97 allowed? s is a string, then why should an integer be assigned to it by implicit conversion?

来自 explicit specifier:

The explicit specifier specifies that a constructor or conversion function (since C++11) doesn't allow implicit conversions or copy-initialization. It may only appear within the decl-specifier-seq of the declaration of such a function within its class definition.

因此,您不能使赋值运算符显式。

Can this s = 97 implicit conversion be avoided/stopped?

一般来说,不,因为它对于 std::string 是完全合法的。当你打电话时:

basic_string& operator=( CharT ch );

with 97 then 97 which has a type of int converted into char and operator= 执行。

So, why is g++ enable to compile this and clang doesn't?

很可能,您尝试在没有 C++11 支持的情况下使用 clang 编译您的程序。