Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过使用带有伪参数的模板别名来隐藏基类,试图混淆clang和gcc之间的行为差异 考虑以下C++程序: class A { protected: int x; }; template<typename X> using B = A; template<typename T> class C : public B<T> { public: void f() { x = 0; } }; int main() { } A类 { 受保护的: int x; }; 模板 使用B=A; 模板 丙类:公共乙类 { 公众: void f() { x=0; } }; int main() { }_C++_Templates_Language Lawyer_Name Lookup - Fatal编程技术网

通过使用带有伪参数的模板别名来隐藏基类,试图混淆clang和gcc之间的行为差异 考虑以下C++程序: class A { protected: int x; }; template<typename X> using B = A; template<typename T> class C : public B<T> { public: void f() { x = 0; } }; int main() { } A类 { 受保护的: int x; }; 模板 使用B=A; 模板 丙类:公共乙类 { 公众: void f() { x=0; } }; int main() { }

通过使用带有伪参数的模板别名来隐藏基类,试图混淆clang和gcc之间的行为差异 考虑以下C++程序: class A { protected: int x; }; template<typename X> using B = A; template<typename T> class C : public B<T> { public: void f() { x = 0; } }; int main() { } A类 { 受保护的: int x; }; 模板 使用B=A; 模板 丙类:公共乙类 { 公众: void f() { x=0; } }; int main() { },c++,templates,language-lawyer,name-lookup,C++,Templates,Language Lawyer,Name Lookup,当使用clang和gcc将-std=c++17-迂腐错误作为编译选项进行编译时,它们的行为不同:clang编译时没有任何错误,但gcc给出了一个编译错误,即无法查找标识符x < C++标准在这种情况下说什么?这两种行为都是允许的,还是其中一个编译器在这种情况下有bug 编译器资源管理器链接:对于C++17,这里的GCC是正确的 如果类型是依赖的,则它是依赖的 模板参数 [……] 一个简单的模板id,其中模板名称是模板参数或任何模板参数都是依赖项 类型或依赖于类型或值或 包扩展[ 注意:这包

当使用clang和gcc将
-std=c++17-迂腐错误
作为编译选项进行编译时,它们的行为不同:clang编译时没有任何错误,但gcc给出了一个编译错误,即无法查找标识符
x

< C++标准在这种情况下说什么?这两种行为都是允许的,还是其中一个编译器在这种情况下有bug


编译器资源管理器链接:

对于C++17,这里的GCC是正确的

如果类型是依赖的,则它是依赖的

  • 模板参数

  • [……]

  • 一个简单的模板id,其中模板名称是模板参数或任何模板参数都是依赖项 类型或依赖于类型或值或 包扩展[ 注意:这包括一个 在没有模板参数列表的情况下使用的类模板。 — 尾注 ] , 或

B
是一个简单的模板id,它的参数是一个依赖类型,因此由
B
表示的类型是依赖的。当使用依赖类型作为基类时,任何继承的成员都必须通过其基类名称完全限定,或者通过
this->
访问。这看起来类似于Clang的Behavior与CWG关于如何处理此类别名模板的协议一致(在模板定义时急切地替换):

1390.别名模板专门化的依赖关系

根据17.7.2.1[临时dep.type]第8段,如果某一类型是独立的,则该类型是独立的(除其他外)

  • 一个简单的模板id,其中模板名称是模板参数,或者任何模板参数是依赖类型,或者是依赖类型或依赖值的表达式
这适用于别名模板专门化,即使生成的类型不依赖于模板参数:

结构B{typedef int type;}; 使用foo=B的模板; 模板void f(){ foo::type*x;//错误:需要typename } 对于这样的案例,是否有必要修改规则

2012年10月会议记录:

CWG同意在这种情况下不需要
typename
。在某些方面,别名模板专门化与当前实例化类似,可以在模板定义时知道


我认为这可能是重复的:
在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在类模板或成员的定义点或实例化过程中,在非限定名称查找期间,基类作用域不会被检查类模板或成员。
@t.niese我不认为这是一个重复。在这种情况下,基类并不真正依赖于模板参数。问题是编译器是否需要查看它是否不依赖。@HolyBlackCat--显然依赖似乎是一件事。是的。问题是基类是否被计算为s是否依赖。谢谢。报告了错误: