Tôi chỉ nhận ra rằng cố gắng để có được kiểu trả về của một hàm thông qua decltype không liên quan đến ADL (đối số phụ thuộc-tra cứu) trên VS2012 (thử nghiệm bằng cách sử dụng cl.exe V17.00.60610.1).Không có ADL bên trong decltype trên VS2012
sau Ví dụ
#include <stdio.h>
#include <typeinfo>
namespace A {
int Func(void const *) {
printf("A::Func(void const *)\n");
return 0;
}
template <typename T> void Do(T const &t) {
Func(&t);
}
template <typename T> void PrintType(T const &t) {
printf("Type: %s\n", typeid(decltype(Func(&t))).name());
}
}
namespace B {
struct XX { };
float Func(XX const *) {
printf("B::Func(XX const *)\n");
return 0.0f;
}
}
int main(int argc, char **argv) {
B::XX xx;
A::Do(xx);
A::PrintType(xx);
return 0;
}
Cho
B::Func(XX const *)
Type: int
trên VS2012
nhưng (những gì được dự kiến):
B::Func(XX const *)
Type: f
trên gcc 4.7.3.
Vì vậy, ADL hoạt động khi gọi hàm (dòng 1 ở đầu ra) nhưng không khi được sử dụng bên trong decltype trên VS2012.
Hoặc tôi có thiếu một số điểm khác nhau không?
Hỗ trợ 'decltype' của VS2012 khá kém (tìm kiếm" biểu hiện SFINAE "và khóc), vì vậy tôi không ngạc nhiên. – Yakk
nhiều tính năng C++ 11 có rất nhiều chất lượng alpha trong VS2012 và CTP tháng 11 tiếp theo. Giả sử có một danh sách dài các lỗi cố định trong bản xem trước VS2013 (Express hiện có sẵn để tải xuống). Bạn có thể thử vận may của bạn ở đó. – TemplateRex
Vì vậy, những gì về cách cập nhật mới thường xuyên để giải quyết lỗi và thêm các tính năng mới mà MS muốn làm theo kể từ VS2012 ... Vì vậy, những gì ... may mắn thay tôi không bị giới hạn trong lựa chọn trình biên dịch của tôi trong dự án cụ thể này và những giấc mơ được gắn vào VS2013 :-) – mmmmmmmm