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

Ambigous integer assignment to string c++

本文关键字:整数 赋值 不明确 c++ 字符串      更新时间:2023-10-16

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

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

并且,一些附带问题:这段代码用 g++ 完美编译,但不能用 clang 编译,它报告了这个错误:

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

那么,为什么 g++ 能够编译这个而 clang 不能呢?

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

编辑:所以,从Edgar RokyanMSalters的回答来看,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 );

使用9797具有int类型的 转换为char并执行operator=

那么,为什么 g++ 可以编译它而 clang 没有呢?

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

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

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

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

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