if/switch 变量声明强化
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
// after c++17, can be simplefied by using `auto`
const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 2);
if (itr != vec.end()) {
*itr = 3;
}
const std::vector<int>::iterator itr1 = std::find(vec.begin(), vec.end(), 3);
if (itr1 != vec.end()) {
*itr1 = 4;
}
// should output: 1, 4, 3, 4. can be simplefied using `auto`
for (std::vector<int>::iterator element = vec.begin(); element != vec.end(); ++element)
std::cout << *element << std::endl;
}
g++ -std=c++17 2.03.if.switch.cpp -o ifswitch
初始化列表
include <iostream>
#include <initializer_list>
#include <vector>
class Foo {
public:
int value_a;
int value_b;
Foo(int a, int b) : value_a(a), value_b(b) {}
};
class MagicFoo {
public:
std::vector<int> vec;
MagicFoo(std::initializer_list<int> list) {
for (std::initializer_list<int>::iterator it = list.begin(); it != list.end(); ++it) {
vec.push_back(*it);
}
}
void foo(std::initializer_list<int> list) {
for (std::initializer_list<int>::iterator it = list.begin(); it != list.end(); ++it) {
vec.push_back(*it);
}
}
};
int main() {
// before C++11
int arr[3] = {1, 2, 3};
Foo foo(1, 2);
std::vector<int> vec = {1, 2, 3, 4, 5};
// after C++11
MagicFoo magicFoo = {1, 2, 3, 4, 5};
magicFoo.foo({6,7,8,9});
Foo foo2 {3, 4};
std::cout << "arr[0]: " << arr[0] << std::endl;
std::cout << "foo:" << foo.value_a << ", " << foo.value_b << std::endl;
std::cout << "vec: ";
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << std::endl;
}
std::cout << "magicFoo: ";
for (std::vector<int>::iterator it = magicFoo.vec.begin(); it != magicFoo.vec.end(); ++it) {
std::cout << *it << std::endl;
}
std::cout << "foo2: " << foo2.value_a << ", " << foo2.value_b << std::endl;
return 0;
}
g++ -std=c++17 2.04.initializer.list.cpp -o initlist
结构化绑定
编译原有程序报错:
查阅 github.com/changkun/modern-cpp-tutorial/issues/166
并未得到合理解决。
提供资料如下:
g++ 5 不支持
g++ 11 支持
clang 5 也支持
程序没有问题,是编译器版本有点旧。
#include <iostream>
#include <tuple>
#include <string>
std::tuple<int, double, std::string> f() {
return std::make_tuple(1, 2.3, "456");
}
int main() {
int x=0;
double y=0.1;
std::string z="123";
std::cout << x << ", " << y << ", " << z << std::endl;
std:tie(x, y, z) = f();
std::cout << x << ", " << y << ", " << z << std::endl;
return 0;
}
shiyanlou:~/ $ ls [14:33:08]
anaconda3 Code Desktop
shiyanlou:~/ $ history [14:33:20]
1 git clone https://github.com/changkun/modern-cpp-tutorial.git
2 g++ -std=c++17 2.03.if.switch.cpp -o ifswitch
3 ./ifswitch
4 g++ -std=c++17 2.04.initializer.list.cpp -o initlist
5 ./initlist
6 g++ -std=c++17 2.05.structured.binding.cpp -o strubind
7 g++ -std=c++17 2.05.structured.binding.cpp -g -Wall -Wno-unused-variable -pthread -o strubind
8 g++ -std=c++17 2.05.structured.binding.cpp -o strubind
9 g++ -std=c++17 2.05.structured.binding.cpp -g -Wall -Wno-unused-variable -pthread -o strubind
10 g++ -std=c++17 2.05.structured.binding.cpp -o strubind
11 ./strubind
12 g++ -std=c++17 2.05.structured.binding.cpp -o strubind
13 ./strubind
14 gcc -v
15 g++ -v
16 ls
shiyanlou:~/ $ [14:33:24]
shiyanlou:2/ (master) $ g++ -std=c++17 2.03.if.switch.cpp -o ifswitch
2.03.if.switch.cpp: In function \u2018int main()\u2019:
2.03.if.switch.cpp:23:84: error: expected \u2018)\u2019 before \u2018;\u2019 token
f (const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 3);
^
2.03.if.switch.cpp:23:84: error: could not convert \u2018itr\u2019 from \u2018const iterator {aka const __gnu_cxx::__normal_iterator<int*, std::vector<int> >}\u2019 to \u2018bool\u2019
2.03.if.switch.cpp:24:25: error: expected \u2018;\u2019 before \u2018)\u2019 token
itr != vec.end()) {
^
shiyanlou:2/ (master) $ g++ -std=c++17 2.03.if.switch.cpp -o ifswitch
2.03.if.switch.cpp: In function \u2018int main()\u2019:
2.03.if.switch.cpp:23:38: error: redeclaration of \u2018const iterator itr\u2019
const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 3)
^
2.03.if.switch.cpp:18:38: note: \u2018const iterator itr\u2019 previously declared here
const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 2)
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.03.if.switch.cpp -o ifswitch
shiyanlou:2/ (master*) $ ./ifswitch [13:42:51]
1
4
3
4
shiyanlou:2/ (master*) $ [13:43:02]
shiyanlou:2/ (master*) $ g++ -std=c++17 2.04.initializer.list.cpp -o initlist
shiyanlou:2/ (master*) $ ./initlist [13:46:31]
arr[0]: 1
foo:1, 2
vec: 1
2
3
4
5
magicFoo: 1
2
3
4
5
6
7
8
9
foo2: 3, 4
shiyanlou:2/ (master*) $ [13:46:38]
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:19:10: error: expected unqualified-id before \u2018[\u2019 token
auto [x, y, z] = f();
^
2.05.structured.binding.cpp:20:18: error: \u2018x\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:20:31: error: \u2018y\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:20:44: error: \u2018z\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -g -Wall -Wno-unused-variable -pthread -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:19:10: error: expected unqualified-id before \u2018[\u2019 token
auto [x, y, z] = f();
^
2.05.structured.binding.cpp:20:18: error: \u2018x\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:20:31: error: \u2018y\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:20:44: error: \u2018z\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:19:10: error: declaration of \u2018auto x\u2019 has no initializer
auto x, y, z;
^
2.05.structured.binding.cpp:19:13: error: declaration of \u2018auto y\u2019 has no initializer
auto x, y, z;
^
2.05.structured.binding.cpp:19:16: error: declaration of \u2018auto z\u2019 has no initializer
auto x, y, z;
^
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:20:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:20:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:20:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:6: error: expected identifier before \u2018auto\u2019
[auto x,auto y,auto z] = f();
^
2.05.structured.binding.cpp:20:12: error: expected \u2018]\u2019 before \u2018,\u2019 token
[auto x,auto y,auto z] = f();
^
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:20:12: error: expected \u2018{\u2019 before \u2018,\u2019 token
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:13: error: expected primary-expression before \u2018auto\u2019
[auto x,auto y,auto z] = f();
^
2.05.structured.binding.cpp:21:18: error: \u2018x\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:31: error: \u2018y\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:44: error: \u2018z\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -g -Wall -Wno-unused-variable -pthread -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:6: error: expected identifier before \u2018auto\u2019
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp:20:12: error: expected \u2018]\u2019 before \u2018,\u2019 token
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:20:12: error: expected \u2018{\u2019 before \u2018,\u2019 token
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:14: error: expected primary-expression before \u2018auto\u2019
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp:21:18: error: \u2018x\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:31: error: \u2018y\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:44: error: \u2018z\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:6: error: expected identifier before \u2018auto\u2019
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp:20:12: error: expected \u2018]\u2019 before \u2018,\u2019 token
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:20:12: error: expected \u2018{\u2019 before \u2018,\u2019 token
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:20:14: error: expected primary-expression before \u2018auto\u2019
[auto x, auto y, auto z] = f();
^
2.05.structured.binding.cpp:21:18: error: \u2018x\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:31: error: \u2018y\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
2.05.structured.binding.cpp:21:44: error: \u2018z\u2019 was not declared in this scope
std::cout << x << ", " << y << ", " << z << std::endl;
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:21:17: error: inconsistent deduction for \u2018auto\u2019: \u2018int\u2019 and then \u2018double\u2019
auto x=0, y=0.1, z="123";
^
2.05.structured.binding.cpp:21:24: error: inconsistent deduction for \u2018auto\u2019: \u2018int\u2019 and then \u2018const char*\u2019
auto x=0, y=0.1, z="123";
^
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:23:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:23:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:23:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:23:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:25:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:25:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:25:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:25:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:25:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:25:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:16: error: the value of \u2018x\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:21:10: note: \u2018int x\u2019 is not const
auto x=0;
^
2.05.structured.binding.cpp:25:19: error: the value of \u2018y\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:22:10: note: \u2018y\u2019 was not declared \u2018constexpr\u2019
auto y=0.1;
^
2.05.structured.binding.cpp:25:22: error: the value of \u2018z\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:23:10: note: \u2018z\u2019 was not declared \u2018constexpr\u2019
auto z="123";
^
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018x\u2019
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018y\u2019
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018z\u2019
2.05.structured.binding.cpp:25:25: error: expected unqualified-id before \u2018=\u2019 token
std::tuple<x, y, z> = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: cannot convert \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const char*\u2019 in assignment
(x, y, z) = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018std::__cxx11::string {aka std::__cxx11::basic_string<char>}\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
(x, y, z) = f();
^
In file included from /usr/include/c++/5/string:52:0,
from /usr/include/c++/5/bits/locale_classes.h:40,
from /usr/include/c++/5/bits/ios_base.h:41,
from /usr/include/c++/5/ios:42,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from 2.05.structured.binding.cpp:10:
/usr/include/c++/5/bits/basic_string.h:550:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(const basic_string& __str)
^
/usr/include/c++/5/bits/basic_string.h:550:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const std::__cxx11::basic_string<char>&\u2019
/usr/include/c++/5/bits/basic_string.h:558:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(const _CharT* __s)
^
/usr/include/c++/5/bits/basic_string.h:558:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const char*\u2019
/usr/include/c++/5/bits/basic_string.h:569:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(_CharT __c)
^
/usr/include/c++/5/bits/basic_string.h:569:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018char\u2019
/usr/include/c++/5/bits/basic_string.h:587:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(basic_string&& __str)
^
/usr/include/c++/5/bits/basic_string.h:587:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018std::__cxx11::basic_string<char>&&\u2019
/usr/include/c++/5/bits/basic_string.h:598:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::initializer_list<_Tp>) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(initializer_list<_CharT> __l)
^
/usr/include/c++/5/bits/basic_string.h:598:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018std::initializer_list<char>\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:25:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:25:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:25:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
shiyanlou:2/ (master*) $ ./strubind [14:13:51]
0, 0.1, 123
0, 0.1, 123
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:16: error: the value of \u2018x\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:21:9: note: \u2018int x\u2019 is not const
int x=0;
^
2.05.structured.binding.cpp:25:19: error: the value of \u2018y\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:22:12: note: \u2018y\u2019 was not declared \u2018constexpr\u2019
double y=0.1;
^
2.05.structured.binding.cpp:25:22: error: the value of \u2018z\u2019 is not usable in a constant expression
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:23:17: note: \u2018z\u2019 was not declared \u2018constexpr\u2019
std::string z="123";
^
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
std::tuple<x, y, z> = f();
^
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018x\u2019
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018y\u2019
2.05.structured.binding.cpp:25:23: error: type/value mismatch at argument 1 in template parameter list for \u2018template<class ...> class std::tuple\u2019
2.05.structured.binding.cpp:25:23: note: expected a type, got \u2018z\u2019
2.05.structured.binding.cpp:25:25: error: expected unqualified-id before \u2018=\u2019 token
std::tuple<x, y, z> = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:5: error: expected primary-expression before \u2018<\u2019 token
<x, y, z> = f();
^
2.05.structured.binding.cpp:25:15: error: expected primary-expression before \u2018=\u2019 token
<x, y, z> = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018std::__cxx11::string {aka std::__cxx11::basic_string<char>}\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
(x, y, z) = f();
^
In file included from /usr/include/c++/5/string:52:0,
from /usr/include/c++/5/bits/locale_classes.h:40,
from /usr/include/c++/5/bits/ios_base.h:41,
from /usr/include/c++/5/ios:42,
from /usr/include/c++/5/ostream:38,
from /usr/include/c++/5/iostream:39,
from 2.05.structured.binding.cpp:10:
/usr/include/c++/5/bits/basic_string.h:550:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(const basic_string& __str)
^
/usr/include/c++/5/bits/basic_string.h:550:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const std::__cxx11::basic_string<char>&\u2019
/usr/include/c++/5/bits/basic_string.h:558:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(const _CharT* __s)
^
/usr/include/c++/5/bits/basic_string.h:558:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const char*\u2019
/usr/include/c++/5/bits/basic_string.h:569:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(_CharT __c)
^
/usr/include/c++/5/bits/basic_string.h:569:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018char\u2019
/usr/include/c++/5/bits/basic_string.h:587:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(basic_string&& __str)
^
/usr/include/c++/5/bits/basic_string.h:587:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018std::__cxx11::basic_string<char>&&\u2019
/usr/include/c++/5/bits/basic_string.h:598:7: note: candidate: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::initializer_list<_Tp>) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]
operator=(initializer_list<_CharT> __l)
^
/usr/include/c++/5/bits/basic_string.h:598:7: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018std::initializer_list<char>\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:13: error: expected \u2018;\u2019 before \u2018}\u2019 token
{x, y, z} = f();
^
2.05.structured.binding.cpp:25:15: error: expected primary-expression before \u2018=\u2019 token
{x, y, z} = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In lambda function:
2.05.structured.binding.cpp:25:15: error: expected \u2018{\u2019 before \u2018=\u2019 token
[x, y, z] = f();
^
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:15: error: no match for \u2018operator=\u2019 (operand types are \u2018main()::<lambda()>\u2019 and \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019)
2.05.structured.binding.cpp:25:13: note: candidate: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
[x, y, z] = f();
^
2.05.structured.binding.cpp:25:13: note: no known conversion for argument 1 from \u2018std::tuple<int, double, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >\u2019 to \u2018const main()::<lambda()>&\u2019
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
2.05.structured.binding.cpp: In function \u2018int main()\u2019:
2.05.structured.binding.cpp:25:10: error: expected unqualified-id before \u2018[\u2019 token
auto [x, y, z] = f();
^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.05.structured.binding.cpp -o strubind
shiyanlou:2/ (master*) $ ./strubind [14:22:38]
0, 0.1, 123
1, 2.3, 456
shiyanlou:2/ (master*) $ gcc -v [14:22:41]
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.9' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
shiyanlou:2/ (master*) $ g++ -v [14:28:11]
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.9' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
shiyanlou:2/ (master*) $ [14:28:26]