decltype() 不适用于正在编译的类模板

asm*_*mmo 1 c++ templates c++17

我有以下代码片段有问题。我认为编译器无法推导出类型,因为values在编译之前不会知道元素的类型。那正确吗?

vector values{1, 2, 3, 4, 5, 6};
vector<decltype(values[0])> {values};
ostream_iterator<int> printer{cout," "};
copy(ints.crbegin(),ints.crend(),printer);
Run Code Online (Sandbox Code Playgroud)

Ker*_*g73 5

这里的问题是这values[0]是一个int &. 你自己看:

static_assert(std::is_same_v<decltype(values[0]), int &>);
Run Code Online (Sandbox Code Playgroud)

创建引用向量是各种错误。要解决这个问题,只需decltype在整个向量上使用。

std::vector values{1, 2, 3, 4, 5, 6};
decltype(values) ints(values.cbegin(), values.cend());
Run Code Online (Sandbox Code Playgroud)

对于您的示例,这一切都不是必需的,因为您只是在复制向量。所以你可以这样做:

std::vector ints = values;
// Or avoid CTAD entirely
auto ints = values;
Run Code Online (Sandbox Code Playgroud)