gpt4 book ai didi

c++ - 结构绑定(bind)和变量类型

转载 作者:行者123 更新时间:2023-12-02 09:55:14 24 4
gpt4 key购买 nike

我想问一个关于结构绑定(bind)以及变量如何获取类型的问题。
这是我编译的代码。

struct T {
explicit T(int a = 1) {
a_ = a;
std::cout << "Default" << std::endl;
}
T(const T& t) {
a_ = t.a_;
std::cout << "Copy" << std::endl;
}
int a_;
};

int main() {

std::tuple<bool, T> bi{true, T(1)};
std::cout << "START" << std::endl;
auto& [b, i] = bi;
static_assert(std::is_same<decltype(i), T>::value);
std::cout << i.a_ << std::endl;
i.a_++;
std::cout << i.a_ << std::endl;
std::cout << (&i == &get<1>(bi)) << std::endl;


return 0;
}

代码编译,结果为:
Default
Copy
START
1
2
1

如您所见,变量 i实际上是指 get<1>(bi) .
但是,变量 i 的类型是 T自从 std::is_same<decltype(i), T>::value .
你能解释一下为什么结构绑定(bind)会这样工作吗?
我在“C++ 模板:完整指南”一书中读到了它
并且作者指出变量 i必须有类型 std::tuple_element<1, std::tuple<bool, T> >::type&& .我不明白为什么 decltype(i)只是 T .

最佳答案

decltype那样很有趣。它的规范包含一个用于结构化绑定(bind)的特殊条款

4 For an expression e, the type denoted by decltype(e) is defined as follows:

  • if e is an unparenthesized id-expression naming a structured binding ([dcl.struct.bind]), decltype(e) is the referenced type as given in the specification of the structured binding declaration;

  • ...



因此,虽然每个结构化绑定(bind)确实是对元组的引用, decltype报告所指对象的类型。可能是因为结构化绑定(bind)旨在让人感觉像常规命名变量。

关于c++ - 结构绑定(bind)和变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60830650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com