这个代码在ISO C ++中是否合法?

时间:2015-03-22 19:30:27

标签: c++ initialization c++14 iso

所以我正在尝试实现可以​​未初始化的函数参数。这是我写的代码。我的问题是它是否符合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);
}

1 个答案:

答案 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参数。