gpt4 book ai didi

c++ - mem_fun + bind2nd 允许使用任意类型的参数调用方法

转载 作者:可可西里 更新时间:2023-11-01 18:39:25 24 4
gpt4 key购买 nike

考虑这个例子(https://ideone.com/RpFRTZ)

这将有效调用 Foo::comp (const Foo& a)带有不相关类型的参数 Bar .如果我注释掉 std::cout << "a = " << a.s << std::endl;,这不仅会编译它也以某种方式工作并打印Result: 0

如果我确实打印出该值,那么它会出现段错误,这很公平......但为什么它首先要编译?

#include <functional>
#include <string>
#include <iostream>

struct Foo
{
bool comp(const Foo& a)
{
std::cout << "a = " << a.s << std::endl;
return a.s == s;
}

std::string s;

};

struct Bar
{
int a;
};


template <class F, class T>
void execute (F f, T a)
{
std::cout << "Result: " << f (a) << std::endl;

}

int main()
{
Foo* f1 = new Foo;
f1->s = "Hello";

Foo f2;
f2.s = "Bla";

Bar b;
b.a = 100;

execute (std::bind2nd (std::mem_fun(&Foo::comp), b), f1);


return 0;
}

最佳答案

答案在 std::bind2nd 的实现中:

  template<typename _Operation, typename _Tp>
inline binder2nd<_Operation>
bind2nd(const _Operation& __fn, const _Tp& __x)
{
typedef typename _Operation::second_argument_type _Arg2_type;
return binder2nd<_Operation>(__fn, _Arg2_type(__x));
}

您可以看到有一个不安全的 C 风格转换“_Arg2_type(__x)”到正确的类型,所以您的示例编译就像它是这样写的:

execute (std::bind2nd (std::mem_fun(&Foo::comp), (const Foo&)b), f1);

不幸的是,这是有效的 C++ 代码。

关于c++ - mem_fun + bind2nd 允许使用任意类型的参数调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113869/

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