带有初始化程序的C++ new if语句

use*_*174 10 c++ if-statement initializer c++17

"if"语句的cppreference页面;

https://en.cppreference.com/w/cpp/language/if

给出以下例子;

除了由init语句(如果初始化语句是一个声明),并通过名称申报条件(如果条件是一个声明)声明的名字都在相同的范围内,这也是两个语句块引用的范围

std::map<int, std::string> m;
if (auto it = m.find(10); it != m.end()) { return it->size(); }
Run Code Online (Sandbox Code Playgroud)

那是一个错字,不是吗?我不会错过这里的任何东西,它应该是;

it->second.size(); 
Run Code Online (Sandbox Code Playgroud)

要么

it->first;
Run Code Online (Sandbox Code Playgroud)

没有?

Yks*_*nen 8

是的,这是一个错字.iteratorstd::map将间接引用的std::map::value_type,这里value_typestd::pair<const Key, T>.

请参阅std::map::find(来自cppreference)的使用示例:

#include <iostream>
#include <map>
int main()
{  
    std::map<int,char> example = {{1,'a'},{2,'b'}};

    auto search = example.find(2);
    if (search != example.end()) {
        std::cout << "Found " << search->first << " " << search->second << '\n';
    } else {
        std::cout << "Not found\n";
    }
}
Run Code Online (Sandbox Code Playgroud)


P.W*_*P.W 6

你是对的.给出的代码不会编译.看到这里.编译器错误是:

error: 'struct std::pair<const int, std::__cxx11::basic_string<char> >' has no member named 'size'
Run Code Online (Sandbox Code Playgroud)

std::pair没有size会员 但是std::string有它.

所以正确的代码应该是:

if (auto it = m.find(10); it != m.end()) { return it->second.size(); }
Run Code Online (Sandbox Code Playgroud)