繁体   English   中英

C ++标准是否定义结构中成员函数的函数内定义是否必须具有静态链接?

[英]Does the C++ standard define if in-function definitions of member functions in structs must have static linkage?

我在函数中定义的结构中定义了静态函数。 我想获得一个指向内部函数的模板函数指针。

请考虑以下示例:

template <class Func, Func GetToken>
struct token_user {
    void foo () { GetToken(); } // Do something with token.
};

struct generator_out {
    constexpr static const auto get_token() {return 0;}
};

int main() {
    struct generator_in {
        constexpr static const auto get_token() {return 0;}
    };
    // Works fine
    token_user<decltype(&generator_out::get_token), &generator_out::get_token>(); 
    // Fails with GCC, works with clang and msvc
    token_user<decltype(&generator_in::get_token), &generator_in::get_token>();
}

我使用我当地的MSVC 2017编译器以及wandbox.org上的clang 6.0和gcc 8.1编译器进行了测试。 MSVC和clang工作,gcc没有。

谁是对的? clang和msvc是否过于宽容和弯曲c ++标准还是gcc根本没有实现呢? (或者它甚至可能是一个错误?)标准对此有何看法?

编辑 :来自gcc的错误消息:

prog.cc: In function 'int main()':
prog.cc:15:76: error: 'main()::generator_in::get_token' is not a valid template argument for type 'const int (*)()' because 'static constexpr const auto main()::generator_in::get_token()' has no linkage
 token_user<decltype(&generator_in::get_token), &generator_in::get_token>(); // Fails with GCC, works with clang and msvc

GCC是对的, generator_in::get_token没有链接,不能在声明它的范围之外使用,因此不能用作实例化token_user的参数。

[basic.link] / 8和/ 9(我只包括相关部分):

...除非另有说明,否则在块范围内声明的名称没有链接。

例:

 void f() { struct A { int x; }; // no linkage } 

这很重要,因为成员函数具有类的链接。 [basic.link] / 5

...成员函数,静态数据成员,类范围的命名类或枚举,或类范围typedef声明中定义的未命名类或枚举,以便类或枚举具有用于链接目的的typedef名称([dcl] .typedef]),具有相同的链接(如果有的话),作为其所属类的名称。

所以generator_ingenerator_in::get_token都没有链接。

最后: [basic.link] /2.3

- 当名称没有链接时 ,它表示的实体不能通过其他范围的名称引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM