- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,举个例子来说明我的问题背后的道理:下面的代码无法编译,因为 std::basic_ostream::operator<< 不是 const
-合格的。 ( https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/ostream-source.html 表明运算符不符合 const
条件。)
我使用 GNU g++ 6.4.0 编译器编译,并启用了 --std=c++11 标志。
#ifndef TEST_H
#define TEST_H
#include<string>
#include<iostream>
using namespace std;
class ChessPiece{
const string name;
const int side;
public:
ChessPiece(const string&,const int);
void printPiece(const ostream&) const;
};
#endif // TEST_H
...和 test.cpp。
#include"test.h"
ChessPiece::ChessPiece(const string& s,const int bw): name{s}, side{bw} {}
void ChessPiece::printPiece(const ostream& S=cout) const{
S << "a " << (side==1?"white ":"black ") << name << endl;
}
int main(){
ChessPiece p{string("pawn"),-1}; // a black pawn
p.printPiece();
}
但是,我不确定为什么首先会出现这些类型的错误,即使 operator<< 就像上面的代码一样,在逻辑上是 const
.是的,显而易见的答案是“operator<<
以某种方式改变了std::ostream
的内部状态”。
但是,我知道通过使成员成为 mutable
我们可以改变类的内容,只要const
-限定函数在逻辑上是const
.我也知道 std::ostream
的一个实例在调用其 operator<<
之前和之后在逻辑上不会有任何不同. (如有错误请指出,谢谢)
改写,
为什么逻辑上是const
std::basic_ostream::operator<< 不是 const
-限定,而不是让其某些成员可变?
提前谢谢你。
最佳答案
你说:
I also know that an instance of
std::ostream
will not logically differ in any way before and after calling itsoperator<<
.
这是查看 std::ostream
的一种方式。另一种看待它的方式是,它是设备的接口(interface)——文件、控制台、字符串等。如果该接口(interface)中的成员函数更改了底层设备,则将该成员函数设为 const
会产生误导成员函数。
const
的概念是概念性的。看看 one my answers,它稍微探讨了这个主题。是的,可以使 operator<<
函数与 const std::stream
对象一起使用,但它们不是更有意义。他们正在更改为其提供接口(interface)的底层设备,IMO,他们最好使用类型为 const
的非 std::ostream
对象。
关于c++ - 为什么 std::basic_ostream::operator<< 不是 const 限定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562335/
我的 friend 给我发了一个代码,他说在 Windows 中成功编译。我在linux上尝试过,但未能给出以下错误。下面是代码的最小可验证示例。 #include #include using
搜索这个问题的标题给了我很多人引用相同的错误,但在不同的情况下,不幸的是那里提供的答案是针对他们的情况的,我看不出他们能如何帮助我。 我正在尝试重载 operator template class
我已经看过几个关于这个的问题,特别是 Overloading operator&&’很有帮助。它让我知道我的问题是我正在做一些 c++11 无法从中推断出类型的事情。 我认为我的问题的很大一部分是我正
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
在这段代码中,我尝试将迭代器移动 10 个元素。 #include #include #include int main() { using
你好everonye即使我在这里找到了很多关于这个问题的答案,但一个人根本无法向我解释事情的进展如何无法解决它。 所以我的问题是我有一个名为 Matrix 的类,当我尝试将运算符 }’ lvalue
如何在 C++ 中打印 high_resolution_clock? #include #include typedef std::chrono::high_resolution_clock hi
关于这个标题的 StackOverflow 有很多关于这个标题的问题,但没有一个对我有帮助,我真的不明白发生了什么。 我正在尝试创建一个生成随机单词的类。首先,我尝试将所有元音和辅音放在两个不同的 s
我在尝试做一些简单的事情时遇到了一个令人困惑的错误消息 std::cout {1,2,3}; 上面写着 cannot bind 'std::ostream {aka std::basic_ostre
我在尝试编译我的代码时遇到此错误: 1> c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/ostream: In constructor 'Log
我想知道如何在 std::basic_ostream 中插入参数我一直在努力,但我做不到 我需要插入一个参数来选择我想要打印的 arista 值一旦我插入了参数,下一步就很容易了,因为它只是一个 if
根据 cppref , 有一个 operator 过载接受 const char* .似乎转换操作只是加宽了每个 char进入 wchar_t .也就是说,转换(插入)的宽字符数等于窄字符数。那么问
为什么使用用户定义的类进行流操作的典型 header C通常是这样的: std::ostream& operator>(std::istream& is, C&); 不是这样的: template
我想提供一个流运算符来输出 std::chrono::time_point 作为 GMT 日期,我目前有以下内容(仅针对 ostream 进行了简化): using datetime_t = std:
我正在阅读 basic_ostream 对象的 write 方法,这是我在 cppreference 上找到的内容: basic_ostream& write( const char_type* s,
这个问题在这里已经有了答案: Misunderstanding about ostream class and operator << (5 个答案) 关闭 8 年前。 标题是我的问题。 basic
我收到以下错误,我不确定是什么问题 1 IntelliSense: "std::basic_ostream::basic_ostream(const std::basic_ostream::_Myt
上面有转换吗? 最佳答案 将std::string 转换为输出 流?通常是:将字符串转换为从给定字符串中读取字符的输入流: std::string myString = //... std::istr
就在我认为我了解 C++11 中 iostream 的多遍移动构造时(感谢 https://stackoverflow.com/a/8156356/273767 的介绍),我遇到了这个: §27.7.
§27.7.3.9为 operator basic_ostream& operator&& os, const T& x); Effects: os > 的右值重载。) 基本上,它只是转发到左
我是一名优秀的程序员,十分优秀!