Trong ví dụ sau, các đối số hàm được sử dụng để kiểm tra với một biểu thức yêu cầu cho dù một biểu thức sử dụng chúng có được hình thành tốt hay không. Biểu thức yêu cầu không có đối số; nó sử dụng các biến trong phạm vi hàm trực tiếp:
#include <cstddef>
#include <vector>
template<typename T>
void Resize(T &v, std::size_t const n)
{
if constexpr (requires { v.resize(n); })
v.resize(n);
}
template<typename T>
void Eziser(T &v, std::size_t const n)
{
if constexpr (requires { v.eziser(n); })
v.eziser(n);
}
int main()
{
std::vector<int> v;
Resize(v, 10u);
Eziser(v, 10u);
}
Đoạn mã trên biên dịch với nhánh khái niệm Clang. Tuy nhiên, GCC10 chỉ chấp nhận cuộc gọi đến Resize
. ICE GCC9. Clang có đúng khi chấp nhận nó không?
Resize
và Eziser
nên bị từ chối) hoặc cả hai hàm sẽ biên dịch. Tôi sẽ nói clang là đúng.