Код: Выделить всё
enum ResultEnum : unsigned char { Ok, Err };
template
struct Result
{
private:
ResultEnum result;
public:
Result(ResultEnum result, const T& t) /* SHOULD I TAKE THE ARGUMENT BY COPY, REFERENCE OR FORWARDING/UNIVERSAL REFERENCE */
{
this->t = t; /* WHAT WOULD BE BEST HERE? std::move???*/
this->result = result;
}
Result(ResultEnum result, const E& err) /* SAME HERE, COPY, REF OR FORWARDING/UNIVERSAL REF? */
{
this->e = err; /* WHAT WOULD BE BEST HERE? std::move??? Will std::move prevent RVO?*/
this->result = result;
}
union
{
T t;
E e;
};
bool is_ok() const{ return result == ResultEnum::Ok; }
bool is_err() const{ return result == ResultEnum::Err; }
};
struct MyFoo {};
Result createMyFoo()
{
MyFoo f;
return { Ok, f }; /* CAN I EXPECT RVO HERE? WHAT EFFECT WOULD CHANGING THE CONSTRUCTOR ARGUMENTS MAKE, IE., COPY vs REF vs FORWARDING/UNIVERSAL REF */
}
int main()
{
auto f = createMyFoo();
if (f.is_err())
{
/* SOMETHING */
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... timisation