gpt4 book ai didi

c++ - 为什么 std::basic_ostream::operator<< 不是 const 限定的?

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:30 24 4
gpt4 key购买 nike

首先,举个例子来说明我的问题背后的道理:下面的代码无法编译,因为 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 its operator<<.

这是查看 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com