我今天正在阅读一些代码,当时我奇怪地发现引用std::optional
返回的引用似乎是合法的。
所以我开始制作一个最小的例子,但遇到了一些奇怪的事情。我有3个问题也许有人可以帮我解释一下。
funcA(&*opta1)
无法编译?opta3
的构造函数不能编译?似乎optb3
的唯一区别是空参数包?#include <experimental/optional>
using namespace ::std::experimental;
struct A {
int num_ = 1;
};
// Same as struct A but with non-default constructor
struct B {
int num_;
B(int num) : num_(num) {}
};
void funcA(A * a) {}
void funcB(B * b) {}
int main() {
optional<A> opta1(A());
optional<A> opta2 = make_optional<A>(A());
// optional<A> opta3 = make_optional<A>(); // Why doesn't this compile?
// funcA(&*opta1); // Why doesn't this compile?
funcA(&*opta2);
// funcA(&*opta3);
optional<B> optb1(B(1));
optional<B> optb2 = make_optional<B>(B(1));
optional<B> optb3 = make_optional<B>(1); // Compiles now? Only difference is non-empty parameter pack?
funcB(&*optb1); // But this compiles?
funcB(&*optb2);
funcB(&*optb3);
}
编译器资源管理器,以便您可以更轻松地操作它: https://godbolt.org/g/oFLcS1