gpt4 book ai didi

c++ - 带有 std::bind 和重复占位符的未定义结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:18 29 4
gpt4 key购买 nike

我在理解 cppreference page 上的 std::bind 的注释部分时遇到了一些问题。 :它说当重复的占位符出现在同一个绑定(bind)表达式中时——例如多个_1——只有当 u1 是左值或不可移动的右值时,结果才是明确定义的。有人可以举一个定义不明确的例子吗?

最佳答案

以下可能是我能想到的最简单的示例(并且考虑到我对右值的熟悉程度,这正在挑战我的极限)。

首先是代码(可能太简单了,但我认为它对于演示来说是正确的):

#include <iostream>
#include <utility>
#include <functional>

struct Obj
{
Obj()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

Obj(Obj const&)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

Obj(Obj&&)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};

void foo(Obj, Obj)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}

int main()
{
using namespace std::placeholders;
auto fn = std::bind(foo, _1, _1);
fn(Obj());
}

输出

Obj::Obj()
Obj::Obj(Obj &&)
Obj::Obj(Obj &&)
void foo(Obj, Obj)

重要的是只有一个 Obj 是最初构建的明确证据,但随后被“移动”两次,这是一个没有- 没有移动语义。一旦第一步完成,物体就在炼狱中。第二步不是明确定义的,因为源对象不再是明确定义的。重复占位符不能是可移动的右值,否则您在这里看到的可能会发生。

关于c++ - 带有 std::bind 和重复占位符的未定义结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25478133/

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