C ++ lambda默认参数编译器是否行为不当?

时间:2020-10-16 10:01:56

标签: c++ gcc lambda clang c++17

以下哪些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)。


1。 lambda默认参数中的LLVM __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

2。 GCC会忽略语句

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
}


3。 GCC编译错误

gcc1
gcc
gcc1
gcc2

预期行为(GCC):编译没有问题。

可观察到的行为(GCC): gcc gcc2

1 个答案:

答案 0 :(得分:0)

[class.local]本地类在封闭范围内,并且对函数外部名称的访问与封闭功能相同。 [注:本地类中的声明不能从封闭范围内使用(6.2)本地实体。 —尾注]

lambda是一个本地类,因此它不能使用封闭范围(例如__func__)中的变量(除了在其捕获子句中)。

相关问题