假设这段代码如下所示,那么问题是为什么"c“的cv限定符(const)不被保留,其行为与"v”不同?
int main(int argc, char **argv) {
int x{};
int y{};
const auto [v] = std::tuple<int>(x);
const auto [c] = std::tuple<int&&>(std::move(y));
decltype(v) vv = 10; // vv -> const int;
decltype(c) cc = 100; // cc -> int&&;
return 0;
}另外,我可以模仿模板参数演绎的相同类型的演绎过程吗?
template<class T>
void foo(T t) { // here should be T rather than universal reference;
// mimic the same behavior as above somehow ...
}怀疑2:
对于下面的代码,“结构化绑定”的“自动”推断似乎与“自动”的正常用法不同?
我期望的是,对于第一个"auto",decltype(v)应该是const int的类型,而不是int&类型,因为我没有在"auto“旁边指定"&”。那么,对于带有"auto“的”结构化绑定“,有什么特殊的规则吗?
int main(int argc, char **argv) {
int x{};
const auto [v] = std::tuple<int&>(x); // v -> int&;
static_assert(std::is_same_v<decltype(v), int&>);
int& rx = x;
const auto c = rx; // c -> const int;
static_assert(std::is_same_v<decltype(c), const int>);
return 0;
}发布于 2020-07-25 02:52:10
给定的
const auto [v] = std::tuple<T>(x);decltype(v)类型为T const,即const-qualified T。如果T是int,那么decltype(v)就是int const (也可以编写const int)。如果T是int&&,那么decltype(v)就是int&& const,它是int&& (而不是const int&&,它是对const int的引用)。类型int&& const与int&&相同,因为引用总是有效的const。它们所引用的对象可能是可变的,但是在C++中引用本身是不可变的。
有了没有通用引用的模板类型推断,就我所知,您无法模拟此类型转换(将const添加到T)。但存在一个类型转换性状std::add_const_t<T>。
更新疑点2
结构化绑定
const auto [v] = std::tuple<int&>(x); // v -> int&;不是类似于
int& rx = x;
const auto c = rx; // c -> const int;相反,它类似于
const auto e = std::tuple<int&>(x);
auto&& v = std::get<0>(std::move(e));const限定适用于元组,而不适用于v.引用限定符的约束,或者引用限定符的缺乏适用于元组。V的绑定总是类似于引用。
这种奇怪实际上是另一种情况:
const auto [v] = std::tuple<int>(x);V仍然是类似引用的,但decltype(v)是int。区别在于,结构化绑定中的绑定是别名,而不是引用。它们是所提到的事物的不同名称,但它们本身没有引用类型。
所以:
const auto [v] = std::tuple<T>(x);最荒谬的是:
const auto e = std::tuple<T>(x);
auto&& r = std::get<0>(std::move(e));
(introduce v as a name for that which r refers to)第三行不是我们能写的东西。
发布于 2020-07-25 03:30:40
正如杰夫·加雷特所提到的,const将适用于推导出的整个auto类型。例如,如果类型为int&,那么const auto将与auto const相同,后者与int& const相同。引用是const,而不是数据。
现在,你能做些什么?您不必停止使用auto。您可以简单地指定const auto&。auto将推断为int,整个类型将是const int& (等效为int const&)。这就是你如何让你的数据成为康斯特。
https://stackoverflow.com/questions/63083356
复制相似问题