gpt4 book ai didi

c++ - 运算符中的常量行为 >>

转载 作者:行者123 更新时间:2023-11-30 01:50:43 28 4
gpt4 key购买 nike

让我们考虑以下代码(实时地址:http://ideone.com/3Ky4Kr)

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>

class StrStrTest {
public:
StrStrTest(const std::string& ba) {
a = (char*)calloc(1, ba.length() + 1);
strcpy(a, ba.c_str());
}
virtual ~StrStrTest() {
free(a);
}
private:
char* a;
friend std::basic_ostream<char>& operator << (std::basic_ostream<char>& ss, const StrStrTest& a);
friend std::basic_istream<char>& operator >> (std::basic_istream<char>& ss,const StrStrTest& a);
};
std::basic_ostream<char>& operator << (std::basic_ostream<char>& ss, const StrStrTest& a) {
ss << a.a;
return ss;
}
std::basic_istream<char>& operator >> (std::basic_istream<char>& ss,
const StrStrTest& a) {
ss >> a.a; // <<-- HERE
// a.a = NULL;
return ss;
}
int main()
{
StrStrTest bb("foo");
std::cin >> bb;
std::cout << bb;
}

首先,为什么要编译?在标有 <<-- HERE 的行上,我(巧妙地)修改了一个 const 对象。 (显然 a.a = NULL; 无法编译,这太明显了)。

其次,这会导致未定义的行为吗?

PS:请不要认为代码不安全,可能会覆盖不属于它的内存,char* vs. std::string 等。 .. 我知道这些,这不是问题的重点,这不是生产代码。

最佳答案

您正在使用的重载是这样的:operator>>(std::istream&, char*)。它按值接受 char*。它不会修改指针(即它不会将指针更改为指向其他地方)。它修改指针保存地址的数据,将空终止的 c 字符串写入该位置。因此,不会违反对象的常量性,因为该数据不是对象的一部分。

如果你尝试做这样的事情:

a.a = NULL;

修改对象的成员,因此是不允许的。

Secondly does this lead to undefined behaviour?

它可以,如果 a.a 没有指向正确分配的内存,并且没有足够的空间用于流中的下一个空格分隔的 char 数据。但不是因为与 StrStrTest 对象的常量性有关。

关于c++ - 运算符中的常量行为 >>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102980/

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