2017-07-30 99 views
4

我見過這種形式的語法上CodeFights.com爲C++函數:C++中返回參數列表(如看到CodeFights)局部變量

int i,j,w,myFunction(auto s, auto v) { 
    // here, i, j,and w are local variable, apparently initialized to 0 
    // all work done inside this function is typical, legal C++ 
    return [some int value]; 
} 

我一直在網上搜索,以確定這句法但是我不能。這是合法的C++還是CodeFights特有的語法?有人能給我這種初始化名稱,以便我可以查看它嗎?

+0

我同意@Ron:上面的建議,但同樣想指出,在即時滿足的時候,[遊戲化爲了學習](https://en.wikipedia.org/wiki/Gamification_of_learning)不一定總是一件壞事(特別是如果替代方案是缺乏任何研究的話)。對於年輕的學生來說,仔細研究(例如優秀的C++書籍)與遊戲化相結合可能是一個很好的組合。 _But_,首先是基礎! – dfri

回答

3

該代碼可能成爲合法的C++ 20。原因如下:

C++中C語言聲明遺留問題的一個怪癖是多個聲明可以在一行上進行。

int a, b, c; 

如你所知,你可以添加指針和引用進來,保留「基本」型:

int a, *b, &c = x; 

也是合法擴展這個語法怪癖函數聲明。以下聲明fint函數返回:

int a, b, c, f(); 

給定一個適當的範圍內,你甚至可以定義在同一行的功能:

struct S { 
    int a, b, c, f() { return 0; } 
}; 

當然,你可以添加參數功能:

struct S { 
    int a, b, c, f(float x, double y) { return x + y; } 
}; 

的最後一步是把那些參數類型爲auto,其中C++ 20可以全部作爲概念提案的一部分,a feature originally planned for C++17

GCC已經支持這種語法作爲擴展。下面是一個完整的例子:

#include <iostream> 

struct S { 
    int a, b, c, f(auto x, auto y) { return x + y; } 
}; 

int main() 
{ 
    S s; 
    std::cout << s.f(1.0, 2.0) << '\n'; 
} 

這意味着當代碼是半正確或者可能會在未來正確的,意見都沒有,因爲ijw不是局部變量,它們沒有初始化爲0.

這也絕對不是C++的「典型」用法。

+1

我不會被初始化爲零,因爲它們是文件範圍? – AndyG

+0

@AndyG:在我的例子中,它們不是文件範圍,它們是'S'的數據成員。 –

0

試着先編譯它然後問!

prog.cc:1:38: error: a function-definition is not allowed here before '{' token 
int i,j,w,myFunction(auto s, auto v) { 
            ^
+1

好吧,它可能是C++ 17或更高版本中引入的一些奇特的新語法。用一個編譯器和一組編譯器標記編譯代碼並不能證明這麼多。 –

+0

@ChristianHackl好,如果是這樣的話,這肯定不是標準。而且我明白這個問題正在遭受這個問題。你如何提出改進我的答案? – gsamaras

+0

'auto'參數似乎是[C++ 20的概念]的一部分(http://en.cppreference.com/w/cpp/language/constraints)。一個「無限制的佔位符」,無論這意味着什麼...... –