sguardo al codice:Perché è possibile utilizzare il costruttore predefinito privato in decltype()?
#include <iostream>
#include <utility>
class test
{
private:
test() { }
public:
test foo() { return *this; }
static const char *name() { return "test"; }
};
int main()
{
std::cout << decltype(test().foo())::name() << std::endl; // 1
std::cout << decltype(std::declval<test>().foo())::name() << std::endl; // 2
}
mi aspettavo // 1
linea non può essere compilato in quanto il costruttore di default di test
è privato.
However, it works well. L'ho testato sul mio g ++ 4.8.3 con -Wall -Wextra -Werror -pedantic
in incredulità, ma funziona bene senza errori o avvisi.
(In aggiunta, sembra funzionare bene in GCC 4.9.1 pure.)
Da this page, credo che possiamo usare costruttore di default privata se l'espressione è non valutata. Quindi, ho provato quanto segue per controllarlo.
#include <iostream>
#include <utility>
class test
{
private:
test(int) { }
public:
test foo() { return *this; }
static const char *name() { return "test"; }
};
int main()
{
std::cout << decltype(test().foo())::name() << std::endl; // 1
std::cout << decltype(std::declval<test>().foo())::name() << std::endl; // 2
}
Come previsto, non è stato compilato.
Ma .... perché ?? Com'è possibile? Possiamo utilizzare i membri privati con espressioni non valutate? O esiste una regola speciale per i costruttori predefiniti? Potresti spiegarmi perché?
Non si compila in clang. –
@ T.C. Oh veramente? allora potrebbe essere solo l'errore di GCC .. – ikh
Um, C++ 98 non ha 'decltype'. O 'declval'. Certo che non si compila. –