Посмотрите на код:Почему я могу использовать собственный конструктор по умолчанию в 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
}
Я ожидал // 1
линия не может быть скомпилирован, так как конструктор по умолчанию test
является частным.
However, it works well. Я испытал это на своем g ++ 4.8.3 с -Wall -Wextra -Werror -pedantic
в недоумении, но он хорошо работает без каких-либо ошибок или предупреждений.
(Кроме того, кажется, работает хорошо в GCC 4.9.1, а также.)
Из this page, я думаю, мы можем использовать приватный конструктор по умолчанию, если выражение невычисленное. Итак, я проверил следующее, чтобы проверить это.
#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
}
Как и ожидалось, он не был составлен.
Но .... Почему? Как это возможно? Можем ли мы использовать частных пользователей в неудовлетворительном выражении? Или существует специальное правило для конструкторов по умолчанию? Не могли бы вы объяснить мне, почему?
Не компилируется в clang. –
@ T.C. Да неужели? то это может быть просто ошибка GCC .. – ikh
Ум, C++ 98 не имеет 'decltype'. Или 'declval'. Конечно, он не компилируется. –