对字符串 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 );
所以,我的主要问题是:
basic_string& operator=( CharT ch );
不应该是explicit吗?也就是说,为什么允许s = 97
? s
是一个字符串,那为什么要隐式转换赋给一个整数呢?
这个s = 97
隐式转换可以是avoided/stopped吗?
还有一些附带问题:这段代码用 g++ 编译得很好,但用 clang 编译得不好,它报告了这个错误:
error: expected ';' at end of declaration
std::string s{"someThing"};
^
那么,为什么 g++ 可以编译它而 clang 不能?
编辑:感谢 Edgar Rokyan,现在它使用 clang++ 和 -std=c++11
选项进行编译。
编辑:因此,根据 Edgar Rokyan 和 MSalters、assignment 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?
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 编译您的程序。
因此,在使用 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 );
所以,我的主要问题是:
basic_string& operator=( CharT ch );
不应该是explicit吗?也就是说,为什么允许s = 97
?s
是一个字符串,那为什么要隐式转换赋给一个整数呢?这个
s = 97
隐式转换可以是avoided/stopped吗?
还有一些附带问题:这段代码用 g++ 编译得很好,但用 clang 编译得不好,它报告了这个错误:
error: expected ';' at end of declaration
std::string s{"someThing"};
^
那么,为什么 g++ 可以编译它而 clang 不能?
编辑:感谢 Edgar Rokyan,现在它使用 clang++ 和 -std=c++11
选项进行编译。
编辑:因此,根据 Edgar Rokyan 和 MSalters、assignment operator can't be made explicit
的回答,好的,但为什么允许将整数分配给字符串?
Shouldn't
basic_string& operator=( CharT ch )
; beexplicit
?
不可能,它不是构造函数或转换函数
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?
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 编译您的程序。