Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果在结构化绑定声明示例中使用初始值设定项,格式是否错误?_C++_C++17 - Fatal编程技术网

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++可能有点困难;