Nhìn vào mã:Tại sao tôi có thể sử dụng hàm tạo mặc định riêng tư trong 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
}
tôi mong đợi // 1
dòng không thể được biên dịch bởi vì các nhà xây dựng mặc định của test
là tư nhân.
However, it works well. Tôi đã thử nghiệm trên g ++ 4.8.3 của tôi với -Wall -Wextra -Werror -pedantic
với sự hoài nghi, nhưng nó hoạt động tốt mà không có bất kỳ lỗi hoặc cảnh báo nào.
(Bên cạnh đó, có vẻ như để làm việc tốt trong GCC 4.9.1 là tốt.)
Từ this page, tôi đoán chúng ta có thể sử dụng constructor mặc định riêng nếu biểu thức là unevaluated. Vì vậy, tôi đã kiểm tra những điều sau đây để kiểm tra nó.
#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
}
Đúng như dự đoán, nó không được biên dịch.
Nhưng .... tại sao ?? Làm cách nào để có thể? Chúng tôi có thể sử dụng riêng tư thành viên trong biểu thức chưa được đánh giá không? Hoặc là có một quy tắc đặc biệt cho các nhà thầu mặc định? Bạn có thể giải thích cho tôi tại sao?
Không biên dịch trong tiếng kêu. –
@ T.C. Oh thật sao? sau đó nó có thể chỉ là lỗi của GCC .. – ikh
Um, C++ 98 không có 'decltype'. Hoặc 'declval'. Tất nhiên nó không biên dịch. –