为什么我不能在构造函数中链式调用方法?

6

我正在尝试为一个文件设置权限。我认为在处理 QFile 对象时可以只使用一行代码,就像这样。

QFile("somefile.txt").setPermissions(QFile::WriteOther);

代码编译并运行,但是没有做任何事情。当然,我按照正确的方式操作时,它就起作用了。(这并不奇怪)

QFile tempFileHandle("somefile.txt");
tempFileHandle.setPermissions(QFile::WriteOther);

我认为这是一个理解C++语法的好机会。我承认我的原始方法不起作用,但是为什么呢?


3
这个有效。将其更改为将内容写入在构造函数中打开的文件中也是有效的。 - chris
5
临时对象基本上是const。可能有两个setPermissions的重载函数,一个用于非const QFile(被第二个示例使用),另一个用于const QFile(被第一个示例使用),显然它实际上并没有做任何事情。 - Jerry Coffin
2
@JerryCoffin 这是真的吗?根据这个,这段代码应该打印出“const”,但它没有。 - jrok
1
@jrok:因此,“基本上”是这样的。临时变量实际上并不是const,但仍然不会(例如)绑定到非const引用,只能绑定到const引用。如果不深入研究QFile的代码,很难确定到底发生了什么。 - Jerry Coffin
2
我知道这一点,但这里没有涉及到任何引用。或者我有什么遗漏吗? - jrok
显示剩余6条评论
2个回答

1

嗯,我不了解QFile,也不知道你的观察是什么,但它可能归结于QFile析构函数中所做的任何事情。

第一个示例创建临时对象。我猜测它的构造函数创建了somefile.txt文件。然后setPermissions在该文件上设置了您指定的内容。现在问题是析构函数会做什么:

  • 它可能会删除文件,而您看不到任何东西
  • 它可能会(我不会期望这个,但谁知道呢)将文件设置为只读
  • 恢复一些默认值

在另一个示例中,您创建了命名变量,直到超出范围才被销毁,您甚至可以将对象从磁盘上的文件中分离出来,这可能会使析构函数对该文件的影响无效。


这是唯一合理的解释。 - Julien Royer

0

好的,你说它编译并运行了,但没有做任何事情。setPermissions() 方法是否被调用过?你有检查过吗?在我看来,编译器已经优化掉了整个代码行,因为你只是在一个临时对象上工作。


编译器不允许这样做。 - Julien Royer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接