2

我将嵌套的括号初始化列表传递给类构造函数:

#include <iostream>
#include <type_traits>
#include <variant>
#include <vector>

class NestedInteger final {
 public:
  NestedInteger(int i) : type_(INT), val_int_(i) {}

  // NestedInteger(std::initializer_list<NestedInteger> ni) {
  template <typename T>
  NestedInteger(std::initializer_list<T> ni) {
    for (auto it = ni.begin(); it != ni.end(); it++) {
      val_vec_.push_back(*it);
    }   
  }

 private:
  enum { INT, VECTOR } type_;
  int val_int_;
  std::vector<NestedInteger> val_vec_;
};

int main() {
  NestedInteger ni1{1};
  NestedInteger ni2{1, 2, 3}; 
  NestedInteger ni3{{1}, 2, 3}; 
  NestedInteger ni4{{1, 2, 3}};
  NestedInteger ni5{{1, 2, 3}, {4, 5, 6, 7}};
  return 0;
}

我得到了编译错误:

t.cpp:29:44: error: no matching function for call to ‘NestedInteger::NestedInteger(<brace-enclosed initializer list>)’
   29 |   NestedInteger ni5{{1, 2, 3}, {4, 5, 6, 7}};
      |                                            ^
t.cpp:12:3: note: candidate: ‘template<class T> NestedInteger::NestedInteger(std::initializer_list<_Tp>)’
   12 |   NestedInteger(std::initializer_list<T> ni) {
      |   ^~~~~~~~~~~~~
t.cpp:12:3: note:   template argument deduction/substitution failed:
t.cpp:29:44: note:   candidate expects 1 argument, 2 provided
   29 |   NestedInteger ni5{{1, 2, 3}, {4, 5, 6, 7}};
...

我在这里阅读了 cppreference 中的列表初始化。我可以告诉表达式属于第一种语法类型:

T object { arg1, arg2, ... }; (1)

使用花括号初始化列表初始化命名变量(即,可能为空的括号括起来的表达式列表或嵌套的花括号初始化列表)

我无法理解有关效果的解释

你能帮忙弄清楚:

  1. 本案例与说明中的哪一项相符?

  2. 这是此处描述的非推断上下文吗?

顺便说一句,如果我将模板更改为特定类型作为注释行,编译错误就会消失。

4

0 回答 0