我似乎無法理解爲什麼有型const int的下面的代碼編譯:爲什麼類型const double沒有被達到範圍的lambda捕獲,但const int是?
int main()
{
using T = int;
const T x = 1;
auto lam = [] (T p) { return x+p; };
}
$ clang++ -c lambda1.cpp -std=c++11
$
,而這其中有const類型雙不:
int main()
{
using T = double;
const T x = 1.0;
auto lam = [] (T p) { return x+p; };
}
$ clang++ -c lambda2.cpp -std=c++11
lambda1.cpp:5:32: error: variable 'x' cannot be implicitly captured in a lambda with no capture-default specified
auto lam = [] (T p) { return x+p; };
^
lambda1.cpp:4:11: note: 'x' declared here
const T x = 1.0;
^
lambda1.cpp:5:14: note: lambda expression begins here
auto lam = [] (T p) { return x+p; };
^
1 error generated.
與constexpr雙尚未編譯:
int main()
{
using T = double;
constexpr T x = 1.0;
auto lam = [] (T p) { return x+p; };
}
$ clang++ -c lambda3.cpp -std=c++11
$
爲什麼int的行爲不同於double,或者除int以外的任何其他類型,即int被const限定符接受,但double/other類型s必須是constexpr?另外,爲什麼這個代碼用C++ 11編譯,我從[1]中得到的理解是,這種隱式捕獲是C++ 14的特性。
.. [1] how is this lambda with an empty capture list able to refer to reaching-scope name?
關聯[靜態類成員類型爲double的常量表達式初始值設定項](http://stackoverflow.com/q/30742288/1708801) –
我從來沒有理解爲什麼這麼多問題不包括未版本化的語言標記。你在這個問題上得到了更多的關注,不是每個跟蹤C++標籤的人都跟蹤C++ 11或C++ 14等...... –
感謝您的反饋和您的詳細解答。我將確保C++標籤在未來的發佈中進入問題。 – eg0x20