程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++標准14取消decltype推算函數返回類型

c++標准14取消decltype推算函數返回類型

編輯:C++入門知識

c++標准14取消decltype推算函數返回類型


Table of Contents

1. c++11之前不支持auto關鍵字2. c++11支持auto關鍵字2.1. 但是不能自動推斷函數返回類型2.2. 使用-> decltype來聲明返回類型3. c++14讓事情又回到簡單4. 我們該使用哪個c++版本

1 c++11之前不支持auto關鍵字

下面的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) {
^~~~

2 c++11支持auto關鍵字

2.1 但是不能自動推斷函數返回類型

還是上面的例子代碼,這次編譯加上-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.

2.2 使用-> decltype來聲明返回類型

先來看看C++11的推薦做法, 在函數後面加上怪怪的語法

auto add(int a, int b) -> decltype(a + b) {

編譯通過.

3 c++14讓事情又回到簡單

-> decltype(a+ b) 這個語法讓人一下感覺不像c++了. 不過14標准作為11標准的快速跟進, 又把事情拉回去. -> decltype變成了短命的過渡方案. 現在可以完全拋棄不用了. 在編譯選項中添加-std=c++14後, 下面的代碼就通過了

auto add(int a, int b) {
   int i = a + b;
   return i;
}

4 我們該使用哪個c++版本

由於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還在制定標准過程中, 當前不建議使用.

Author: dean

Created: 2015-12-27 日 10:23

Validate

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved