引用std :: optional :: operator *()返回的引用

时间:2017-03-03 18:57:59

标签: c++ optional

我今天正在阅读一些代码,当时我奇怪地发现引用std::optional返回的引用似乎是合法的。

所以我开始制作一个最小的例子,但遇到了一些奇怪的事情。我有3个问题也许有人可以帮我解释一下。

  1. 为什么funcA(&*opta1)无法编译?
  2. 为什么opta3的构造函数不能编译?似乎optb3的唯一区别是空参数包?
  3. 引用引用是否合法?
  4. #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

0 个答案:

没有答案