Construindo um valor através de dois construtores implícitos?
TLDR: Eu tenho duas classes modeloOuter
eInner
. Inner<X>
pode ser implicitamente construído a partir deX
eOuter<Y>
pode ser implicitamente construído a partir deY
. DevemosOuter<Inner<X>> = X()
trabalhos?
Mais detalhes:
Suponha que eu tenha as duas classes a seguir:
template<typename T>
class Inner {
public:
Inner(const T& value) {}
Inner(T&& value) {}
};
template<typename T>
class Outer {
public:
Outer(const T& value) {}
Outer(T&& value) {}
};
Considere a seguinte função:
struct SomeType{};
Outer<Inner<SomeType>> DoSomethingFails() {
SomeType value;
return value;
}
O g ++ reclama:
no viable conversion from 'SomeType' to 'Outer<Inner<SomeType> >'
note: candidate constructor not viable: no known conversion from 'SomeType' to 'const Inner<SomeType> &' for 1st argument
Mas se eu fizer o seguinte:
Outer<Inner<SomeType>> DoSomethingWorks() {
SomeType value;
return Inner<SomeType>(value);
}
Funciona. É razoável esperarDoSomethingFails
trabalhar? Se não, por que? E o código pode ser alterado de uma maneira queDoSomethingFails
trabalho?