结构化绑定在C ++ 17中不起作用

时间:2018-08-13 03:03:52

标签: c++ c++17

我已经尝试了Expert C++ Programming中的以下代码段。 g ++正在给出编译错误。这仅仅是g ++无法赶上C ++ 17语法的一种情况吗?

lib_test.cpp:39:15: error: expected unqualified-id before ‘[’ token
          auto [iter, success] = m.try_emplace(b.country, b, 1);
               ^

我使用-std=c++17标志。

g ++(Ubuntu 6.4.0-17ubuntu1)6.4.0 20180424

#include <iostream>
#include <functional>
#include <list>
#include <map>

using namespace std;


struct billionaire {
  string  name;
  double  dollars;
  string  country;
};  


void efficient_map_test()
{
   list<billionaire> billionares {
           {"Bill Gates", 86.0, "USA"},
           {"Warren Buffet", 75.6, "USA"},
           {"Jeff Bezos", 72.8, "USA"},
           {"Amnancio Ortega", 71.3, "Spain"},
           {"Mark Zuckerberg", 56.0, "USA"},
           {"Carlos Slim", 54.5, "Mexico"},

           {"Bernard Arnualt", 41.5, "France"},
           {"Liliane Bettencourt", 39.5, "France"},
           {"Wang Jianlin", 31.3, "China"},
           {"Li Ka-shing", 31.2, "Hong Kong"}
   };      

   map<string, pair<const billionaire, size_t>> m;

   for (const auto &b: billionares) {
      auto [iter, success] = m.try_emplace(b.country, b, 1);
      if (!success) {
           iter->second.second += 1;
        }    
   }    


 for (const auto &[key, value]: m) {
        const auto &[b, count ] = value;
        cout << b.country << " : " << count
                                   << "billionaires. Richest is "
                                   << b.name << " with " << b.dollars
             << " B$n";            
   }         
}  

int main()
{
     return 0;
}  

编辑:1. -std = C ++ 17-> -std = c ++ 17
      2.添加了空的main,使其可以复制/粘贴就绪

2 个答案:

答案 0 :(得分:2)

您只是使编译标志错误。这是小写的c:

g++ -std=c++17 -o main main.cpp

不是像您在问题(-std=C++17)中写的那样大写C。 哦,请添加一个空的main函数,以便您的代码可以复制粘贴。

答案 1 :(得分:0)

这是由于缺乏 gcc 支持(版本 6.3、6.4、...)。

尽管您可以在这些版本中使用 c++17,但缺少此特定功能。

这个小例子可以在 Debian Buster g++ (Debian 8.3.0-6) 8.3.0 上编译没有错误,但是在 Debian Strech g++ (Debian 6.3.0-18+deb9u1) 6.3.0 上编译失败。

#include <tuple>

int main() {
  auto a = std::make_tuple(0, true);
  auto [b, c] = a;
  return 0;
}
# g++ -std=c++17 -o main main.cc 
main.cc: In function 'int main()':
main.cc:5:8: error: expected unqualified-id before '[' token
   auto [b, c] = a;
        ^