在我看来,在C++中可以使用该类型std::optional<std::reference_wrapper<T>>
.这种类型的对象本质上是对类型对象T
或空值的引用,即几乎是一个指针.我的问题:
有没有之间的任何概念上的差异std::optional<std::reference_wrapper<T>>
和T*
?
有什么实际区别吗?是否有可能选择std::optional<std::reference_wrapper<T>>
结束的情况T*
?
请考虑C#中的以下代码.
public int Foo(int a)
{
// ...
}
// in some other method
int? x = 0;
x = Foo(x);
Run Code Online (Sandbox Code Playgroud)
最后一行将返回一个cannot convert from 'int?' to 'int'
足够公平的编译错误.但是,例如在Haskell中Maybe
,有一个与Nullable
C#相对应.既然Maybe
是Functor
我将能够适用Foo
于x
使用fmap
.C#有类似的机制吗?
以下代码
#include <iostream>
#include <map>
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
m.erase(i);
}
};
int main()
{
std::map<int, foo> m;
m.emplace(1, foo() );
std::cout << m.size() << std::endl;
m[1].kill(m, 1);
std::cout << m.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在没有警告的情况下编译(g ++),执行时没有错误,并且通过输出判断kill
方法foo
从地图中删除对象.但是,我觉得这可能实际上是未定义的行为.似乎kill
在行之后的行m.erase(i)
this
不再指向有效对象.
C++标准对此有何看法?