template <int * ip> struct test {};
struct q {
static int a;
int b;
constexpr q(int b_) : b(b_) {}
};
int i;
constexpr q q0(2);
int main()
{
constexpr test<&i> t1; // Works fine
constexpr test<&q::a> t2; // Works
constexpr test<&q0.b> t3; // Does not work; address of non-static member?
return 0;
}
Khai báo t3 trong đoạn mã trên không thành công mặc dù đối số mẫu &q0.b
được biết trong thời gian biên dịch. Một số googling tiết lộ rằng đây là không được phép theo tiêu chuẩn (phần 14.3.2):Tại sao địa chỉ của thành viên không tĩnh không được cho phép làm tham số không kiểu mẫu?
[Note: Addresses of array elements and names or addresses of non-static class members are not acceptable template-arguments.
X<&s.m> x4; // error: address of non-static membe
Vậy tại sao chính xác được này không được công nhận một cách rõ ràng theo tiêu chuẩn mặc dù các địa chỉ của các thành viên không tĩnh của biến toàn cục là độc đáo cũng như được biết đến trong thời gian biên dịch?
Tôi đã thử điều này trên gcc 5.1.1 và clang 3.5.0 với -std = C++ 11 – nav
Không có '(mới q) -> b' không được biết tại thời gian biên dịch –
Đó là loại không phải là' int * ' , đó là 'int q :: *', phải không? – skypjack