以下哪些C ++ lambda /语句应根据最新的C ++规范运行?
与此相关的上下文:see here。
我在带有clang 11.0.0和gcc 10.2.1的Fedora 33上使用-std=c++17
测试了以下代码段。
更新:将__PRETTY_FUNCTION__
替换为__func__
以符合标准。可以观察到相同的行为。
Update2::Example使用const char * s = __func__
作为默认参数,以验证它在函数范围内是否有效(由于@BenVoigt)。
__func__
void clang() {
[](const char* c = __func__) {std::cout << c << std::endl;}();
}
预期的行为(CLANG):
clang\n
({{1}为void clang()
)观察到的行为(CLANG):
__PRETTY_FUNCTION__
warning: predefined identifier is only valid inside function [-Wpredefined-identifier-outside-function]
({{1}为\n
)top level()
预期产量(GCC):
__PRETTY_FUNCTION__
实测输出(GCC):
template <typename L>
constexpr std::string_view methodName(L l) { return l(); }
#define __METHOD_NAME__ (\
__func__, /* needed for pointer to work */ \
methodName([](const char* c = __func__) {return std::string_view(c);}) \
)
void gcc1() {
std::cout << [](const char* c = __func__) { return c; }() << std::endl; // GCC: This statement doesn't do anything
std::cout << [](const char* c = __func__) { return c; }("gcc") << std::endl;
std::cout << __METHOD_NAME__ << std::endl; // GCC: This statement somehow conflicts with the statements above
}
void gcc2() {
std::cout << __METHOD_NAME__ << std::endl; // GCC: This statement itself works
}
gcc1
gcc
gcc1
gcc2
预期行为(GCC):编译没有问题。
可观察到的行为(GCC): gcc
gcc2
答案 0 :(得分:0)
[class.local]本地类在封闭范围内,并且对函数外部名称的访问与封闭功能相同。 [注:本地类中的声明不能从封闭范围内使用(6.2)本地实体。 —尾注]
lambda是一个本地类,因此它不能使用封闭范围(例如__func__
)中的变量(除了在其捕获子句中)。