草庐IT

overload-resolution

全部标签

c++ - 编译器如何传递 `std::initializer_list` 值? (或 : how can I get around a universal overload with one? )

Continuingmysaga,我意识到我可以使用单个std::initializer_list参数来重载我的访问函数:classarray_md{//...my_type&operator[](size_typei){/*Lotsofcode*/}my_typeconst&operator[](size_typei)const{/*sameLotsofcode,with"const"sprinkledin*/}my_type&operator[](std::initializer_listi){/*Lotsofdifferentcode*/}my_typeconst&operato

C++11 "overloaded lambda"带有可变参数模板和变量捕获

我正在研究一个可能被称为“重载lambda”的C++11习语:http://cpptruths.blogspot.com/2014/05/fun-with-lambdas-c14-style-part-2.htmlhttp://martinecker.com/martincodes/lambda-expression-overloading/使用可变参数模板重载n函数似乎对我很有吸引力,但事实证明它不适用于变量捕获:[&]中的任何一个|[=][y][&y](和[this]等,如果在成员函数中)导致编译失败:error:nomatchforcallto'(overload,main(in

c++ - 为什么指针衰减优先于推导的模板?

假设我正在编写一个函数来打印字符串的长度:templatevoidfoo(constchar(&s)[N]){std::cout现在我想扩展foo以支持非数组:voidfoo(constchar*s){std::cout但事实证明这打破了我最初的预期用途:foo("hello")//nowprintsraw,size=5为什么?这不需要数组到指针的转换,而模板是完全匹配的吗?有没有办法确保我的数组函数被调用? 最佳答案 这种(符合标准的)歧义的根本原因似乎在于转换成本:重载解析试图最小化将参数转换为相应参数所执行的操作。数组实际上是

c++ - 显式转换运算符模板的优先级和歧义

我一直在我的项目中使用模板化的显式转换运算符,以实现从自定义类变体类型的显式转换。重现我的问题的最小示例如下所示(在C++14模式下):#include#include#includeusingnamespacestd;classA{public:templateexplicitoperatorT()const//1{coutexplicitoperatorconstT&()const//2{coutexplicitoperatorT&()//3{cout(a)-3.14)我遇到的问题是为static_cast转换选择的运算符。对于GCC,这是一种预期的(1)情况。输出是:operat

c++ - 如何调用与成员函数同名的内联友元函数?

如此处所述C++11styleSFINAEandfunctionvisibilityontemplateinstantiation类成员函数掩盖了自由函数。使用完全限定的名称通常是可行的,但是我很难处理其他内联声明的类的友元函数。考虑以下示例:namespaceN{structC{friendintf(constC&c){return1;}friendintg(constC&c){return2;}};structD{voidf(){g(C{});//ADLfindsthis::N::f(C{});//notfounddispitefullqualification}};}我想我了解问

c++ - 错误 : no instance of overloaded function

我正在尝试使用以下代码在我的数据库(SQLServer2008)中插入一些行:CDB.cpp#include"CDB.h"voidCDB::ajouterAlerte(){SqlConnection^mySQLConnection;SqlDataAdapter^myDataAdapter;DataSet^myDataSet;DataRow^myRow;SqlParameter^myParameter;try{mySQLConnection=gcnewSqlConnection("DataSource=NECTARYS-PC;InitialCatalog=MonitoringN;Inte

c++ - 以 nullptr 作为参数的函数重载决议

考虑下面的代码。虽然fun的两个重载都接受指针,但将nullptr传递给fun不会导致任何编译错误。然而,非常相似的函数bun无法编译。当我使用typeid(i).name()打印参数i的类型时(修改代码后只是为了打印)我得到相同的类型,只是int*。在fun情况下解决歧义但在bun情况下失败的规则是什么?提前致谢!#includestructFoo{intsth;};templatevoidfun(decltype(U::sth)*i){std::coutvoidfun(U*i){std::cout(nullptr);//bun(nullptr);-->callofoverloade

c++ - 名称查找中的重载解析/歧义(哪一个)

$7.3.3/14(C++03)structA{intx();};structB:A{};structC:A{usingA::x;intx(int);};structD:B,C{usingC::x;intx(double);};intf(D*d){returnd->x();//ambiguous:B::xorC::x}“f”中代码中的注释表明可以预期“B::x”或“C::x”之间存在歧义。然而,在使用g++(ideone)或Comeau编译时,错误略有不同。这些错误不是指示B::x或C::x中的歧义,而是指示A是D的歧义基这一事实prog.cpp:Infunction‘intf(D*)

c++ - 当参数是初始化列表且参数是引用时的重载解析

structA{A(int);};structB{explicitB(A);B(constB&);};Bb({0});我问了一个问题Overloadresolutiongetsdifferentresultbetweengccandclang和@JohannesSchaub-litb解释了活跃的规则。但是我对13.3.3.1.4Referencebinding还有一些疑问。N452713.3.3.1.5[over.ics.list]p1和p81Whenanargumentisaninitializerlist(8.5.4),itisnotanexpressionandspecialru

c++ - 非依赖名称的重载解析何时发生,在定义上下文或实例化点?

3.4[basic.lookup]/p1Overloadresolution(13.3)takesplaceafternamelookuphassucceeded.voidg(long);voidg(int,int);templatevoidf(){g(0);}voidg(int,int=0){}intmain(){f();}gcc编译成功,clang编译失败非依赖名称的重载解析何时发生,是在定义上下文中还是在实例化点?还是两者都对? 最佳答案 在这两种情况下。[温度.res]14.6\8Ifahypotheticalinstant