- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
当我使用 g++
编译以下代码时
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
我收到以下错误消息:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
经过一番思考,这些错误对我来说很有意义。 A()
只是一个临时值,而不是堆栈上的可分配位置,因此它似乎没有地址。如果它没有地址,那么我就无法引用它。好的,好的。
但是等等!如果我将以下转换运算符添加到类 A
class A
{
public:
operator A&() { return *this; }
};
那么一切都很好!我的问题是这是否远程安全。 this
到底是什么?指向何时A()
被构造为临时值?
我对这个事实充满信心
void foo(const A&) {}
可以根据 g++
接受临时值以及我使用过的所有其他编译器。 const
关键字总是可以被抛弃,所以如果 const A&
之间存在任何实际的语义差异,我会感到惊讶。参数和 A&
范围。所以我想这是问我问题的另一种方式:为什么是 const
引用编译器认为安全的临时值,而非 const
引用是不是?
最佳答案
并不是不能获取地址(编译器总是可以命令将其插入堆栈,它使用 ref-to-const 执行此操作),这是程序员意图的问题。使用带有 A& 的接口(interface),它表示“我将修改此参数中的内容,以便您可以在函数调用后阅读”。如果你给它一个临时的,那么它“修改”的东西在函数之后就不存在了。这(可能)是一个编程错误,因此是不允许的。例如,考虑:
void plus_one(int & x) { ++x; }
int main() {
int x = 2;
float f = 10.0;
plus_one(x); plus_one(f);
cout << x << endl << f << endl;
}
这不会编译,但如果临时变量可以绑定(bind)到 ref-to-non-const,它会编译但会产生令人惊讶的结果。在 plus_one(f) 中,f 将被隐式转换为临时 int,plus_one 将获取 temp 并递增它,而底层浮点 f 保持不变。当 plus_one 返回时,它没有任何效果。这几乎肯定不是程序员的本意。
规则偶尔会搞砸。一个常见的例子(描述为 here)是试图打开一个文件,打印一些东西,然后关闭它。您希望能够做到:
ofstream("bar.t") << "flah";
但你不能,因为 operator<< 需要一个 ref-to-non-const。您的选择是将其分成两行,或调用返回 ref-to-non-const 的方法:
ofstream("bar.t").flush() << "flah";
关于c++ - 引用类型转换运算符 : asking for trouble?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1040950/
我是 Alexa 技能开发的初学者。我已经安装了 ASK-CLI并且一直正常工作到今天,现在我收到此错误 :'bash: ask: command not found'我已经安装了 node 和 gi
我问这个部分是因为我想知道这样做的最佳实践方式,部分是因为我得到的最高谷歌结果是 2002 年的一个论坛帖子,其中甚至没有回答这个问题。 我继承了一些 VB6 代码,并且在所述代码中有一些 MsgBo
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在开发 Amazon Alexa 的一项技能。我正在尝试使用 echosim.io 进行相同的测试,但问题如下。 我的技能名称是MyBot,调用名称也是如此。 在 echosim.io 中,当我说
我刚刚从 tarbal 版本 freeradius-server-2.2.0.tar.gz 安装了 freeradius。comile 并使安装运行良好。我也可以运行 radius -X 以首先在 D
我的项目在通过毕业时遇到问题..我尝试制作一个考勤指纹系统.. 我的问题是当我扫描指纹并保存指纹模板时..然后我关闭我的netbeans...保存文件未保存,正在被删除...如果我想验证它们,我必须再
我有一个场景,我必须通过他的 id 获取用户的详细信息。这是一个进入我的 HTTP 处理程序层的 HTTP 请求,我利用从请求中获得的 id,向参与者发送一条消息,然后参与者与数据库服务对话以获取用户
我想查询 OWL2 文件中的两个类之间是否存在某些 ObjectPropery (OP)。我正在使用 JENA API 构建 SPARQL 查询。 到目前为止我尝试过的: 首先,我使用 SELECT
最近在 Akka actor 中创建的等待处理的 scala.concurrent.Future 对象遇到了一些超时,我想知道如何处理这些超时事件。他们真的迷路了吗?它们是否会重试并保存在内存中,或者
假设我们有两个品种,猫和狗。在 go 上,我们希望 cats meow 和 dogs bark。 ask 使给定代理集中的代理以随机顺序运行代码块,这很棒。但是,如果我们这样做: to go as
我想查询 OWL2 文件中的两个类之间是否存在某些 ObjectPropery (OP)。我正在使用 JENA API 构建 SPARQL 查询。 到目前为止我尝试过的: 首先,我使用 SELECT
这是我编写的一个简单函数,用于通过定时重试执行 Akka“询问”。有一个明显的竞争条件,我不确定如何解决。 def askWithRetry(actor: ActorRef, message: Any
我正在重写与 Particle.io API 通信的 Alexa 技能。这次我使用 ask-cli 来管理上传。所以到目前为止我的基本流程是: “问新”以创建入门技能和 lambda “请求部署”以创
我正在使用 ask ( ? ) 获取类型为 Set[String] 的值从一个 Actor 。然而, Actor 返回 Future[Any] . 转换此 Future[Any] 的正确方法是什么?至
我为终端编写了一个简单的小迷宫游戏,它反复要求用户做某事(例如“您想朝哪个方向走?[N/E/S/W]”)。我有一个在循环中运行的 navigate() 方法,它会触发这些问题,存储他们的答案并根据答案
我想知道如何请求用户的许可来更改蓝牙的状态?我不需要 wifi,因为它不是强制性的。 我搜索基本窗口,用户在该窗口中选中"is"或“否”按钮以允许应用修改应用的状态。 最佳答案 此代码将生成一个弹出窗
为了解释,我将代码分为几个子部分:(相同范围) 在第 1、2 和 3 部分,任何连接数据库的尝试都会成功。值得一提的是,每个 mysql_close() 都会立即由退出继续。 在第 4 部分,尝试连
我在这里搜索了很多主题,但无法解决我的问题。请帮我检查一下。 我制作了注册页面,当我制作密码字段时...... 我有users_controller.php,例如: class UsersContro
伙计们,我在表中有这样的结构: 该表保存了连接到交易所的一组市场链接的价格历史记录。数据不断增长 - 每 x 秒就会添加新价格。 我需要找出当前哪个MarketLink最便宜(询问价格) 应该查询什么
在我的程序的一部分中,我使用 JOptionPane 询问用户是否确定他将要做什么。但我不想让用户每次尝试都这样问,所以我喜欢使用 android 中带有“不再询问”的一些对话框的功能,但不知道如何在
我是一名优秀的程序员,十分优秀!