gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:26:20 25 4
gpt4 key购买 nike

下列哪个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(void clang()__PRETTY_FUNCTION__)

  • 观察到的行为(CLANG):
  • 编译器警告:warning: predefined identifier is only valid inside function [-Wpredefined-identifier-outside-function]
  • 打印出\n(top level()__PRETTY_FUNCTION__)

  • 2. 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
    }

    预期输出(GCC):
    gcc1
    gcc
    gcc1
    gcc2
    观察到的输出(GCC):
    gcc
    gcc2

    3. GCC编译错误
    void gcc3() {
    std::string_view s = [](const char* c = __func__) { return std::string_view(c); }();
    std::cout << s << std::endl;
    }
    预期行为(GCC):编译没有问题。
    观察到的行为(GCC): error: internal compiler error: in finish_expr_stmt

    最佳答案

    [class.local] The local class is in the scope of the enclosing scope, and has the same access to names outside the function as does the enclosing function. [Note: A declaration in a local class cannot odr-use (6.2) a local entity from an enclosing scope. — end note]


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

    关于c++ - C++ lambda默认参数编译器是否行为不当?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64387023/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com