在我们通过引用传递参数时,是否可以为函数的参数提供默认值.在C++中
例如,当我尝试声明一个函数时:
virtual const ULONG Write(ULONG &State = 0, bool sequence = true);
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它给出了一个错误:
错误C2440:'default argument':无法从'const int'转换为'unsigned long&'不是'const'的引用不能绑定到非左值
这段代码是否有效(和定义的行为)?
int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)
这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...
当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:
if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud) 为什么std::optional(目前std::experimental::optional在libc ++中)没有引用类型的专门化(与之相比boost::optional)?
我认为这将是非常有用的选择.
是否有一些对象引用了STL中可能已存在的对象语义?
我希望函数具有一个具体类型的通用引用参数.我希望它是通用引用,所以当我不想检查存储在其中的值时,我可以传递一个临时对象.
这是一个例子:
bool bCompareData(const uint8_t *arg_0, const uint8_t *arg_1, size_t &szComparedData)
{
size_t &i = szComparedData;
for (; arg_1[i]; ++i)
if (arg_1[i] != arg_0[i])
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
可能的函数调用:
bCompareData(Obj.uIdObject.data(), Ref.uIdTargetObject.data(), size_t()) // here we are passing a temporary (rvalue)
/*________________________*/
size_t lval;
bCompareData(Obj.uIdObject.data(), Ref.uIdTargetObject.data(), lval) // here we are passing a named variable (lvalue)
Run Code Online (Sandbox Code Playgroud)
在第一个函数调用编译器中使用上述函数声明将给出错误,如果我将"size_t&szComparedData"更改为rvalue引用"size_t && szComparedData",它将在第二次调用时失败.
现在我需要的是Universal References,但我也希望在我的论证中有一个具体的类型,而不是使用模板.
我正在使用VC++ U3 2013编译器.