2015-01-07 48 views
3

在C++中縮寫函數的狀態如何?到處搜索,我在C++概念的working draft中看到了它的一些提及。與此同時,GCC似乎與代碼沒有問題,像C++中縮寫函數的狀態是什麼?

#include <iostream> 

auto foo(auto x) { 
    std::cout << x << std::endl; 
} 

int main() { 
    foo(1); 
    foo(1.2); 
} 

現在,我要是有-Wpedantic編譯,我得到警告:

g++ -std=c++14 -Wpedantic test08.cpp -o test08 
test08.cpp:3:9: warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] 
auto foo(auto x) { 
     ^

告訴我,縮寫功能都沒有完全在標準中。因此,他們關於C++標準和普通C++編譯器的現狀如何?

+0

沒有有在C++ 14標準沒有這樣的事情。你甚至可以在[標準草案]中檢查自己(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf)。 –

+4

這將由Concepts TS添加。注意,它也允許你寫'auto foo(std :: vector const&v)'這樣的東西 - 畢竟,模板參數推導和'auto'的規則是相同的 - 模初始化列表。 –

+0

你似乎回答了你自己的問題:他們不在當前的標準中,而是在概念提案中。 – interjay

回答

5

我想你問的是縮寫功能模板。您鏈接的文檔對此進行了定義:

如果自動類型說明符出現在函數聲明的參數類型中,則函數聲明會聲明一個縮寫函數模板。例如:void f(const auto&, int);

意思就是例如將轉化爲:

template <typename T> 
void f(const T&, int); 

的C++ 14標準越來越generic lambdas。例如:auto lambda = [](auto x, auto y) {return x + y;};但我還沒有看到任何說「通用lambda」功能將擴展到傳統功能。

不像Technical Report 1Technical Report 2將被釋放作爲單獨的技術規格:Is TR2 Going to be Released in C++17?

看來,對於概念技術規範,特別是下一個障礙是WG21 Concepts Meeting

你可以閱讀更多的有關概念技術規範在這裏:http://en.wikipedia.org/wiki/Concepts_%28C%2B%2B%29

+2

跨欄通過,它是出票 – Cubbi

+1

@Cubbi非常感謝您的更新!我在查看數組擴展技術規範[這裏](http://stackoverflow.com/a/28094952/2642059)有沒有機會了解該人的身份? –

3

它看起來像你想創建一個模板函數,以及至少它看起來像你需要一個:)

template <typename X> 
void foo(X x) { 
    std::cout << x << std::endl; 
} 

這將在編譯時展開,編譯器應該怎麼知道哪種auto應被解釋爲?在你的例子中你使用兩種不同的類型。

請注意,雖然您不在函數內部返回任何內容,但仍然使用auto作爲返回類型。

+3

編譯器會知道該類型,就像它使用多態lambda時一樣:將foo()轉換爲函數模板:) –

+4

是的,問題中的縮寫函數模板與該模板相同('auto'被推斷就像一個模板參數,因爲它已經在C++ 14多態lambda表達式中)。但是你還沒有回答這個問題:他們關於C++標準和普通C++編譯器的現狀是什麼? –

+1

我一定錯過了那個部分:)因爲我讀了當前的草稿:https://github.com/cplusplus/concepts-ts/blob/master/html/concepts.pdf它離準備工作還有很長的路要走,所以C++ 17最早。但老實說,我敢肯定其他人有一個更精確的答案:) –