首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++:允许临时对象调用非const成员函数的设计理念是什么?

c++:允许临时对象调用非const成员函数的设计理念是什么?
EN

Stack Overflow用户
提问于 2018-07-14 11:57:55
回答 4查看 544关注 0票数 4

我搜索堆栈溢出,人们说修改临时对象很愚蠢,所以不允许将临时对象绑定到非const lvalue引用,就像不能将临时对象传递给具有非const值引用的函数一样。

那么,为什么允许临时对象调用具有修改对象和做“愚蠢”事情的非const成员函数?你可能会说,“哈,这是允许的,因为我们想给程序员一些灵活性,让他们做一些”愚蠢“的事情,而这些事情其实并不愚蠢。”这也是我很难买到的原因,因为如果我买了这个借口,我认为“临时绑定到非一致性引用”可以用同样的理由来证明。

谢谢!我在这里几乎找不到相关的问题。他们刚刚告诉我这是个例外,但我们为什么允许这个例外呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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引用。”

代码语言:javascript
复制
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已经在努力“修正”这个问题(或者让程序员来控制这个问题)。

票数 1
EN

Stack Overflow用户

发布于 2018-07-14 13:35:19

不能将临时引用绑定到非const引用,但是这里的基本原理是而不是,以避免临时引用的意外修改。其基本原理是,您不希望悄悄地忽略修改希望修改的内容。

想象一下这是允许的,那么:

代码语言:javascript
复制
void foo(double& x);
int y;
foo(y); //user wants to modify y, but instead a temporary is modified

就其本身而言,修改一个临时对象是完全可以的,而且通常是有用的。没有理由不允许。

票数 4
EN

Stack Overflow用户

发布于 2018-07-14 12:11:20

假设您有一个工厂方法,它按照建议返回一个unique_ptr

代码语言:javascript
复制
std::unique_ptr<MyClass> createObject();

但是,您需要一个指向已创建对象的共享指针。所以你写

代码语言:javascript
复制
std::shared_ptr<MyClass> mySharedObject{createObject().release()};

您刚刚在一个临时对象上调用了一个非const方法。我觉得很有用。

好的。我忘记了shared_ptr构造函数接受unique_ptr。然而,为什么禁止例如快速读取第一行文件?

代码语言:javascript
复制
std::array<char, 140> line;
std::istream{"MyFile.txt"}.readline(line, line.size()-1);

也许更有趣的是,为什么禁止将非参数引用绑定到临时引用?对lvalue参数的非连续引用是指输出参数。允许绑定到临时的,会导致由于转换而产生的细微错误。例如

代码语言:javascript
复制
void readShort(short & out)
{
   out = 7;
}

long var;
readShort(var);

创建了一个临时short来匹配函数参数类型。现在禁止将其绑定到引用。如果允许,函数将分配给临时函数,然后结果将被丢弃。

更新

您还能解释为什么不允许将临时对象绑定到本地非参数值引用吗?

现在有一组规则用于绑定对对象的引用,不管是在函数调用或本地引用定义期间完成的。根据上下文创建两组不同的规则将使语言变得复杂(已经非常复杂),并且需要一些理由。我想还没有人要求做出这样的改变,以使标准委员会信服。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51338287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档