我搜索堆栈溢出,人们说修改临时对象很愚蠢,所以不允许将临时对象绑定到非const lvalue引用,就像不能将临时对象传递给具有非const值引用的函数一样。
那么,为什么允许临时对象调用具有修改对象和做“愚蠢”事情的非const成员函数?你可能会说,“哈,这是允许的,因为我们想给程序员一些灵活性,让他们做一些”愚蠢“的事情,而这些事情其实并不愚蠢。”这也是我很难买到的原因,因为如果我买了这个借口,我认为“临时绑定到非一致性引用”可以用同样的理由来证明。
谢谢!我在这里几乎找不到相关的问题。他们刚刚告诉我这是个例外,但我们为什么允许这个例外呢?
发布于 2018-08-07 03:23:03
好的,我在这里放一些额外的材料。以下资料引用自David Vandevoorde,Nicolai M. Josuttis,Douglas Gregor-C++ Templates_ The Complete Guide-Addison (2017),C.2.1成员函数的隐含论点。
“当引用是传统的隐式*该参数时,旧的特例允许将rvalue绑定到对非const类型的lvalue引用。”
struct S{
void f1() {}//the old rule
void f2() && {}
void f3() & {}
};
int main()
{
S().f1();//Here, I THINK const this is bound to non-const, thus allowing calling non-const member functions.(the comment here is not quoted from the book.)
S().f2();
S().f3();//not okay
return 1;
}使用-std=c++11编译选项。因此,这意味着C++设计人员已经认识到,允许具有隐式const this*的临时对象调用非const成员函数的旧规则不太好。因此在C++11中,他们引入了&和&&后缀函数声明。
但是当谈到允许临时对象调用非const成员函数的旧规则的设计哲学时,我认为这不值得深入研究。C++ 11已经在努力“修正”这个问题(或者让程序员来控制这个问题)。
发布于 2018-07-14 13:35:19
不能将临时引用绑定到非const引用,但是这里的基本原理是而不是,以避免临时引用的意外修改。其基本原理是,您不希望悄悄地忽略修改希望修改的内容。
想象一下这是允许的,那么:
void foo(double& x);
int y;
foo(y); //user wants to modify y, but instead a temporary is modified就其本身而言,修改一个临时对象是完全可以的,而且通常是有用的。没有理由不允许。
发布于 2018-07-14 12:11:20
假设您有一个工厂方法,它按照建议返回一个unique_ptr
std::unique_ptr<MyClass> createObject();但是,您需要一个指向已创建对象的共享指针。所以你写
std::shared_ptr<MyClass> mySharedObject{createObject().release()};您刚刚在一个临时对象上调用了一个非const方法。我觉得很有用。
好的。我忘记了shared_ptr构造函数接受unique_ptr。然而,为什么禁止例如快速读取第一行文件?
std::array<char, 140> line;
std::istream{"MyFile.txt"}.readline(line, line.size()-1);也许更有趣的是,为什么禁止将非参数引用绑定到临时引用?对lvalue参数的非连续引用是指输出参数。允许绑定到临时的,会导致由于转换而产生的细微错误。例如
void readShort(short & out)
{
out = 7;
}
long var;
readShort(var);创建了一个临时short来匹配函数参数类型。现在禁止将其绑定到引用。如果允许,函数将分配给临时函数,然后结果将被丢弃。
更新
您还能解释为什么不允许将临时对象绑定到本地非参数值引用吗?
现在有一组规则用于绑定对对象的引用,不管是在函数调用或本地引用定义期间完成的。根据上下文创建两组不同的规则将使语言变得复杂(已经非常复杂),并且需要一些理由。我想还没有人要求做出这样的改变,以使标准委员会信服。
https://stackoverflow.com/questions/51338287
复制相似问题