C++ 如果在结构化绑定声明示例中使用初始值设定项,格式是否错误?
我正在通读报纸 我认为我很好地理解了这些例子,直到我看到了底部的最后一个例子C++ 如果在结构化绑定声明示例中使用初始值设定项,格式是否错误?,c++,c++17,C++,C++17,我正在通读报纸 我认为我很好地理解了这些例子,直到我看到了底部的最后一个例子 #include <set> #include <string> #include <iomanip> #include <iostream> int main() { std::set<std::string> myset; if (auto [iter, success] = myset.insert("Hello&q
#include <set>
#include <string>
#include <iomanip>
#include <iostream>
int main() {
std::set<std::string> myset;
if (auto [iter, success] = myset.insert("Hello"); success)
std::cout << "insert is successful. The value is " <<
std::quoted(*iter) << '\n';
else
std::cout << "The value " << std::quoted(*iter) << " already
exists in the set\n";
}
只将插入的“Hello”
分配给iter
,而成功将是什么?!?另一种方法会违反表达式部分。但它显然是编译和运行的,所以我肯定遗漏了什么
这表示如果表达式位于标识符列表中,则声明的格式不正确
它没有这么说。它表示,如果表达式使用标识符列表中的任何名称,则其格式不正确myset.insert(“Hello”)
不会这样做,所以没关系
std::set::insert
返回一个std::pair
,其中std::set::iterator
标记元素位置,bool
指示是否插入了元素。因此auto[iter,success]=myset.insert(“Hello”)
捕获该对,并将iter
设置为std::set::iterator
和success
设置为bool
这表示如果表达式位于标识符列表中,则声明的格式不正确
它没有这么说。它表示,如果表达式使用标识符列表中的任何名称,则其格式不正确myset.insert(“Hello”)
不会这样做,所以没关系
std::set::insert
返回一个std::pair
,其中std::set::iterator
标记元素位置,bool
指示是否插入了元素。因此,auto[iter,success]=myset.insert(“Hello”)
捕获该对,并将iter
设置为std::set::iterator
,将success
设置为bool
我感觉您对结构化绑定和if与初始值设定项感到困惑,但简单的方法是对它们进行分解
if (auto [a, b] = foo(); b)
由两部分组成=第一部分是初始值设定项(auto[a,b]=foo()
),第二部分(b)是条件。它完全等同于
{
auto [a, b] = foo();
if (b)
}
在上面的示例中,a
和b
将被推断为foo
指令的任何返回类型,与if
条件无关 我觉得你对结构化绑定和if与初始值设定项感到困惑,但简单的方法是分解它们
if (auto [a, b] = foo(); b)
由两部分组成=第一部分是初始值设定项(auto[a,b]=foo()
),第二部分(b)是条件。它完全等同于
{
auto [a, b] = foo();
if (b)
}
在上面的示例中,a
和b
将被推断为foo
指令的任何返回类型,与if
条件无关 我认为,这个问题应该重新表述-它不是关于结构化绑定,它实际上是关于使用初始值设定项语法的新if
。我认为,这个问题应该重新表述-它不是关于结构化绑定,它实际上是关于使用初始值设定项语法的新if
。这是有意义的,但为什么这一对的第二部分会被推到布尔?因为它与标识符列表中的标识符成功匹配?@aldr第二部分不是布尔值。insert
函数返回一个std::pair
。结构化绑定就是从这个返回类型推导出来的,并将它的变量绑定到它。if(auto[iter,success]=myset.insert(“Hello”);success)
的直译是:执行myset.insert(“Hello”)
,并从它返回的对中将迭代器部分存储在iter
中,将布尔部分存储在success
中。然后,如果success为true
则执行if语句的true部分。@aldr无需担心。很乐意帮忙。C++可能有点困难;这是有道理的,但为什么这一对的第二部分会被推断为布尔呢?因为它与标识符列表中的标识符成功匹配?@aldr第二部分不是布尔值。insert
函数返回一个std::pair
。结构化绑定就是从这个返回类型推导出来的,并将它的变量绑定到它。if(auto[iter,success]=myset.insert(“Hello”);success)
的直译是:执行myset.insert(“Hello”)
,并从它返回的对中将迭代器部分存储在iter
中,将布尔部分存储在success
中。然后,如果success为true
则执行if语句的true部分。@aldr无需担心。很乐意帮忙。C++可能有点困难;