所以我正在尝试实现可以未初始化的函数参数。这是我写的代码。我的问题是它是否符合ISO C ++标准(如果可能的话,版本14)。
#include <iostream>
#include <typeinfo>
using namespace std;
template<typename type>
struct nzeroinittmpliteral
{
nzeroinittmpliteral() { }
nzeroinittmpliteral(type arg) { d = arg; }
//nzeroinittmpliteral(const nzeroinittmpliteral &) = delete;
operator type () & { return d; }
operator type () && { return d; }
type d;
} ;
void func(bool bIsPointerValid, nzeroinittmpliteral<int *> pVar = {})
{
if(bIsPointerValid)
{
cout << *pVar << endl;
}
else
{
pVar = new int;
*pVar = 8;
cout << *pVar << endl;
delete pVar;
}
}
int main()
{
func(true, { (int *)&(const int &)int{9} } );
func(false);
}
答案 0 :(得分:4)
如果您想传递可能未初始化的参数,只是不通过它,请使用重载。看:
void func(int value)
{
cout << value << endl;
}
void func()
{
// no 'value' was initialized here :)
func(8);
}
或者只是在参数中给出一个默认值,如果您将在身体中提供一个默认值:
void func(int value = 8)
{
cout << value << endl;
}
除此之外,您还可以查看boost::optional
:
void func(boost::optional<int> optvalue = boost::none) {
if (optvalue) {
cout << *optvalue << endl;
} else {
// nothing passed
cout << "foo" << endl;
}
}
直接回答您的问题:您的代码有效。
func(true, { (int *)&(const int &)int{9} } );
通过将临时转换为const引用,可以将其生命周期延长到引用本身的生命周期,该引用将在func
返回后结束。但这太冗了,你可以简单写一下:
void func(int* value) { if (value) {...} }
func(&(const int &)9);
func(nullptr);
传递的实际参数是您的nzeroinittmpliteral
,并且通过始终调用其中一个构造函数来初始化它。默认构造函数没有初始化d
成员,但这不是一个很大的改进,因为它只是一个指针。使用nullptr
更好,无需使用bool参数。