草庐IT

c++ - std::common_type 应该使用 std::decay 吗?

给定类型A,B,我关心std::common_type的确切定义,不考虑可变参数std::common_type对于任意类型A....所以让usingT=decltype(true?std::declval():std::declval());usingC=std::common_type;现在,根据一些消息来源,我发现了以下关系(为简洁起见,跳过typename):cppreference.com:C::type=std::decay::typecplusplus.com:C::type=TGCC4.8.1实现:C::type=std::decay::type如果T有效,否则C不包含

c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误

这与所有“需要左值作为赋值的左操作数”错误问题有点相反。我有一个重载运算符[]的类,但只有返回临时的版本。如果要返回一个int:structFoo{intoperator[](intidx)const{returnint(0);}};Foof;f[1]=5;我会理所当然地得到左值编译器错误。但是,如果它返回一个结构类型,编译器(在这种情况下是GCC7.2)根本不会提示:structBar{};structFoo{Baroperator[](intidx)const{returnBar();}};Foof;f[1]=Bar();如果Bar是临时的并且没有专门的运算符=,为什么不会以同样的

c++ - 重载运算符 [] 并没有得到 "lvalue required as left operand of assignment"错误

这与所有“需要左值作为赋值的左操作数”错误问题有点相反。我有一个重载运算符[]的类,但只有返回临时的版本。如果要返回一个int:structFoo{intoperator[](intidx)const{returnint(0);}};Foof;f[1]=5;我会理所当然地得到左值编译器错误。但是,如果它返回一个结构类型,编译器(在这种情况下是GCC7.2)根本不会提示:structBar{};structFoo{Baroperator[](intidx)const{returnBar();}};Foof;f[1]=Bar();如果Bar是临时的并且没有专门的运算符=,为什么不会以同样的

c++ - 在 C++11 中,如何获取没有名称的临时左值?

我有一个传统的C库和一个函数(setsockopts)需要一个指针参数。在C++11(gcc4.8)中,我可以在不初始化命名变量的情况下传递此参数吗?我有以下不满意的解决方案:#include#includeintderef(intconst*p){return*p;}usingnamespacestd;intmain(){intarg=0;cout(newint(42))) 最佳答案 如果这真的很麻烦(未测试),我会为setsockopt创建一个包装器templateintsetsockopt(intsocket,intlevel

c++ - 在 C++11 中,如何获取没有名称的临时左值?

我有一个传统的C库和一个函数(setsockopts)需要一个指针参数。在C++11(gcc4.8)中,我可以在不初始化命名变量的情况下传递此参数吗?我有以下不满意的解决方案:#include#includeintderef(intconst*p){return*p;}usingnamespacestd;intmain(){intarg=0;cout(newint(42))) 最佳答案 如果这真的很麻烦(未测试),我会为setsockopt创建一个包装器templateintsetsockopt(intsocket,intlevel

c++ - 右值引用被视为左值?

我发布了这个答案:https://stackoverflow.com/a/28459180/2642059其中包含以下代码:voidfoo(string&&bar){string*temp=&bar;coutbar是右值还是左值?我问是因为我显然不能获取右值的地址,但我可以像这里所做的那样获取右值引用的地址。如果您可以对右值引用执行任何操作,而您可以对左值引用执行任何操作,那么用“&&”而不是“&”区分两者有什么意义? 最佳答案 Isbaranrvalueoranlvalue?问题自己回答。任何有名字的都是左值(1)。所以bar是一

c++ - 右值引用被视为左值?

我发布了这个答案:https://stackoverflow.com/a/28459180/2642059其中包含以下代码:voidfoo(string&&bar){string*temp=&bar;coutbar是右值还是左值?我问是因为我显然不能获取右值的地址,但我可以像这里所做的那样获取右值引用的地址。如果您可以对右值引用执行任何操作,而您可以对左值引用执行任何操作,那么用“&&”而不是“&”区分两者有什么意义? 最佳答案 Isbaranrvalueoranlvalue?问题自己回答。任何有名字的都是左值(1)。所以bar是一

c++ - 为什么 C++0x 右值引用不是默认值?

即将推出的C++标准C++0x的一个很酷的新特性是“右值引用”。右值引用类似于左值(普通)引用,除了它可以绑定(bind)到临时值(通常,临时只能绑定(bind)到const引用):voidFunctionWithLValueRef(int&a){…}voidFunctionWithRValueRef(int&&a){…}intmain(){FunctionWithLValueRef(5);//error,5isatemporaryFunctionWithRValueRef(5);//okay}那么,他们为什么要发明一种全新的类型,而不是仅仅取消对正常引用的限制以允许它们绑定(bind

c++ - 为什么 C++0x 右值引用不是默认值?

即将推出的C++标准C++0x的一个很酷的新特性是“右值引用”。右值引用类似于左值(普通)引用,除了它可以绑定(bind)到临时值(通常,临时只能绑定(bind)到const引用):voidFunctionWithLValueRef(int&a){…}voidFunctionWithRValueRef(int&&a){…}intmain(){FunctionWithLValueRef(5);//error,5isatemporaryFunctionWithRValueRef(5);//okay}那么,他们为什么要发明一种全新的类型,而不是仅仅取消对正常引用的限制以允许它们绑定(bind

C++03.在编译时测试 rvalue-vs-lvalue,而不仅仅是在运行时

在C++03中,Boost的Foreach,使用thisinterestingtechnique,可以检测在运行时表达式是左值还是右值。(我通过这个StackOverflow问题发现:RvaluesinC++03)这是demoofthisworkingatrun-time(这是我在思考otherrecentquestionofmine时提出的一个更基本的问题。对此的回答可能有助于我们回答其他问题。)现在我已经阐明了问题,在编译时测试C++03中的右值性,我将谈谈我迄今为止一直在尝试的事情。我希望能够在编译时进行此检查。在C++11中很容易,但我对C++03很好奇。我正在尝试以他们的想法