下面的auto關鍵字在c++11之前是不支持的
auto add(int a, int b) { int i = a + b; return i; } int main(int argc,char ** argv) { try { std::cout << add(1,2) << std::endl; } catch(std::exception const &e) { std::cerr << e.what() << std::endl; } }
編譯器clang++ 3.6 會如下報錯:
../src/main.cc:13:1: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] auto add(int a, int b) { ^ ../src/main.cc:13:1: error: 'auto' not allowed in function return type auto add(int a, int b) { ^~~~
還是上面的例子代碼,這次編譯加上-std=c++11
../src/main.cc:13:1: error: 'auto' return without trailing return type; deduced return types are a C++14 extension auto add(int a, int b) { ^ 1 error generated.
這裡clang++報錯, 說auto後面沒有跟上返回類型的說明, 或者使用c++14標准提供的deduced return types.
先來看看C++11的推薦做法, 在函數後面加上怪怪的語法
auto add(int a, int b) -> decltype(a + b) {
編譯通過.
-> decltype(a+ b) 這個語法讓人一下感覺不像c++了. 不過14標准作為11標准的快速跟進, 又把事情拉回去. -> decltype變成了短命的過渡方案. 現在可以完全拋棄不用了. 在編譯選項中添加-std=c++14後, 下面的代碼就通過了
auto add(int a, int b) { int i = a + b; return i; }
由於c++14標准已經發布, 而主要編譯器都已經支持, 因此現在不是再談c++11的時候, 而是應該直接使用c++14標准. 這裡是clang編譯器對c++標准的支持文檔 同時,這裡有我的例子工程: [email protected]:newlisp/cppwizard.git, 采用我自己的newlisp builder對c++代碼進行編譯 只需要修改debug_config.lsp文件的編譯選項即可.
(set 'compile-options "-g -std=c++14")
更新的c++ 17 或者 1z還在制定標准過程中, 當前不建議使用.
Created: 2015-12-27 日 10:23
Validate