gpt4 book ai didi

c++ - GCC 允许访问私有(private)静态成员

转载 作者:可可西里 更新时间:2023-11-01 15:22:15 24 4
gpt4 key购买 nike

此代码适用于 GCC,但不适用于 clang。

class Base
{
static constexpr int PRIVATE = 1;
};

struct Derived : public Base
{
template <class T>
int bar( T & t )
{
return PRIVATE;
}
};

int main()
{
Derived d;
int i = 3;
d.bar(i);
}

Godbolt 链接:https://godbolt.org/g/qPJ47p

在私有(private)成员函数的情况下,如果模板函数被实例化,GCC 会正确检测到访问私有(private)成员的尝试,否则不会。即使从未实例化模板函数,Clang 也会检测到该尝试。

但是,当使用私有(private)静态 constexpr 变量时,GCC(最新的 8.1)无法停止私有(private)访问,即使实例化了模板函数。 Clang 正确(?)提示。

问题:在这种情况下,这两个编译器中哪个符合标准?

在我看来,GCC 允许访问私有(private)静态 constexpr 变量是不正确的。然而与此同时,这似乎并不是一个过于复杂的问题,但它不在最新的 GCC 中:这让它看起来像是故意的。

非常感谢paxdiablo感谢他清晰而彻底的回答。根据他的建议,我制作了一个更全面的测试用例列表,并将其缩小到导致 GCC 问题的 static 说明符。有关详细信息,请参阅此 Godbolt 链接:https://godbolt.org/g/A3zCLk

Comparison of GCC and Clang:

Private member | GCC | Clang

static const | accept | reject
static constexpr | accept | reject
static | accept | reject
const | instantiate | reject
no-specifiers | instantiate | reject
static function | instantiate | reject
function | instantiate | reject

("instantiate" means GCC rejects it upon template instantiation)

最佳答案

绝对看起来像一个错误,因为无论它是实例化的模板函数还是真正的函数,都不应该影响基类中私有(private)成员的可访问性。如果您将代码更改为:

int bar(int&) {
return PRIVATE;
}

然后它正确地提示:

testprog.cpp: In member function 'int Derived::bar(int&)':
testprog.cpp:3:26: error: 'constexpr const int Base::PRIVATE' is private
static constexpr int PRIVATE = 1;
^
testprog.cpp:9:16: error: within this context
return PRIVATE;
^

我只想raise this as a buggcc 上。如果他们确实对其有效性有不同看法,他们会让您知道。

而且,当您确实提交错误时,我建议使用有效的绝对简约示例,这将使他们更容易调试。我把它归结为:

class Base {
static constexpr int PRIVATE = 42;
};
struct Derived : public Base {
template <class T> int bar(T) {
return PRIVATE;
}
};
int main() {
Derived d;
return d.bar(1);
}

您可能还想指出声明 PRIVATE 的各种可能性及其对 gccclang 的影响(这个问题的主干) :

                                gcc       clang
-------- --------
static constexpr int accepted rejected
static const int accepted rejected
const int rejected rejected
int rejected rejected

改用非模板函数(如上所述):

int bar(int) {
return PRIVATE;
}

似乎导致 gcc 本身“行为”:

                                gcc       clang
-------- --------
static constexpr int rejected rejected
static const int rejected rejected
const int rejected rejected
int rejected rejected

所以,如果这确实是 gcc 问题,我会认为 static 和模板之间存在一些相互作用,这导致问题。

关于c++ - GCC 允许访问私有(private)静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50558431/

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