草庐IT

c++ - 制作 C++ 解析器时的歧义解析

我为C++17编写了一个LALR(1)解析器。我发现了156个歧义,其中一些我可以按照标准解决,但另一些我不能。例如:当遇到小于时,在解析“operator+”时发生Shift-Reduce冲突:我们可以将其解析为:(1)template-id->operator-function-id·或:(2)unqualified-id->operator-function-id·其中(1)需要移动,但(2)需要减少。但是,标准有:在名称查找(3.4)发现名称是模板名称或运算符函数ID或文字运算符ID指的是一组重载函数后,其中任何成员都是函数模板,如果其后跟一个137被视为结束分隔符,而不是大于

c++ - 将 R 值传递给采用 L 值的函数时的重载歧义

我有2个重载函数-一个采用L值,另一个采用R值。目的是使该函数可以像这样调用:Objobj;foo(obj);或者:foo(Obj());因此,我编写了2个重载函数:templatevoidfoo(T&v){/*...functionbodycodegoeshere...*/}templatevoidfoo(T&&v){foo(v);}intmain(){foo(int(5));}右值重载只需要委托(delegate)给左值重载。按照我的理解,一旦进入函数体,对v的任何使用都会给我一个左值引用,除非我专门使用std::move或std::forward。所以在R值重载中调用foo(v)

c++ - 如何从模板化基础中消除多个继承的 typedef 的歧义?

编辑:我正在为Windows使用tdm-gcc-4.7.1-2不知道如何解决这个问题。我想将其用作一种类型列表,让我知道我正在尝试使用B中不存在的类型的类型定义。templatestructA{typedefpairtype;};structB:A,A{};B::typefoo;//won'tcompile,ambiguousreference,asexpectedB::A::typebar;//compilesfine??:(有没有办法让它在A上失败?(以及任何其他A未被B继承的),或另一种解决方法?我想我可以使用tuple并递归我的方式,做一个is_same将每个元素与我提供给元函

c++ - 为什么isnan有歧义,如何避免?

由于isnan可以是宏(在C++98中)或在命名空间std中定义的函数(在C++11中),一个明显的(和这个简单的例子说明了编写在这两种情况下都有效的代码的方式可能很幼稚#includeintmain(){doublex=0;usingnamespacestd;isnan(x);}但是,编译它会在GCC(使用-std=c++11)和Clang中给出错误:test.cc:Infunction‘intmain()’:test.cc:6:10:error:callofoverloaded‘isnan(double&)’isambiguousisnan(x);^test.cc:6:10:not

单个限定名称和两个连续名称之间的 C++11 歧义?

下面的C++11程序格式错误吗?structa{structb{};voidf(){};};externstructab;structa::b;intmain(){b.f();}为什么/为什么不?这里感兴趣的是这一行:structa::b;这是内部类a::b的前向声明吗?或者这是全局变量b的定义?相当于:structa(::b); 最佳答案 structa::b;不会声明类型为a的名为b的变量,如果这是您要问的。它是嵌套类型a::b的(冗余)前向声明。空格在C++程序中通常不重要。因此,您的程序声明但从未定义名为b的变量。这违反了一

C++ std::vector initializer_list 重载歧义 (g++/clang++)

考虑以下代码:#include#defineBROKENclassVar{public:#ifdefBROKENtemplateVar(Tx):value(x){}#elseVar(intx):value(x){}#endifintvalue;};classClass{public:Class(std::vectorarg):v{arg}{}std::vectorv;};无论BROKEN是否被定义,Clang++(7.0.1)编译它没有错误,但是如果BROKEN被定义,g++(8.2.1)会引发错误:main.cpp:9:20:error:cannotconvert‘std::vect

c++ - 如果声明了对类型的转换运算符和对类型的引用,为什么直接列表初始化会导致类型引用转换的歧义?

问题出现在thisanswer的上下文中.考虑一个例子:structfoo{intvalue;operatorint&(){returnvalue;}operatorint(){returnvalue;}};intmain(){int&a(foo{});//#1//int&b{foo{}};//#2--ambiguityint&c=foo{};//#3//int&d={foo{}};//#4--ambiguityint&d{a};//#5int&e={a};//#6(void)a;(void)c;(void)d;(void)e;}我不明白为什么#2和#4会导致歧义,而#1和#3不会。所

c++ - 重载 boolean/字符串歧义

为什么C++将我传入的字符串文字转换为boolean值而不是字符串?#includeusingnamespacestd;classA{public:A(stringv){cout输出:1是不是因为编译器不够聪明,无法从char*跳转到string而只是假设bool是最接近指针的东西?我唯一的选择是制作一个基本上与字符串构造函数完全相同的显式char*构造函数吗? 最佳答案 如果你有C++11,你可以使用委托(delegate)构造函数:A(charconst*s):A(std::string(s)){}选择boolean转换构造函数

c++ - 完全限定的静态成员变量中的歧义

在这个示例代码中,有两个句子显示同一个静态变量。第一个没有歧义,但第二个有,为什么?#includeusingnamespacestd;structA{staticconstchara='a';};structB:publicA{};structC:publicA{};structG:publicB,publicC{};intmain(){Gv;coutGCC错误(根据一些评论,clang没有歧义):main.cpp:15:18:error:'A'isanambiguousbaseof'G'coutCodeoncoliru 最佳答案

c++ - operator[](const char *) 歧义

下面的代码#includestructFoo{operatordouble(){return1;}intoperator[](std::stringx){return1;}};intmain(){Foo()["abcd"];}使用g++编译良好,但使用clang和intel编译器编译失败,因为声明的方法和native运算符[]之间存在歧义。如果Foo隐式转换为int,我会很清楚,但这里转换为double。这不是解决了歧义吗? 最佳答案 §13.3.3.1.2[over.ics.user]/p1-2:Auser-definedconv