Có yêu cầu các biểu thức được phép ghi lại các biến số của phạm vi kèm theo không?


10

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?


2
ICE luôn là vấn đề biên dịch.
Jarod42

Tôi sẽ nói rằng nó sẽ từ chối mã nếu nó không được phép bắt biến cục bộ (vì vậy cả hai ResizeEzisernên bị từ chối) hoặc cả hai hàm sẽ biên dịch. Tôi sẽ nói clang là đúng.
Jarod42

@ Jarod42 Có. Hành vi GCC rõ ràng là lỗi. Tôi sẽ nộp PR. Tôi cũng nghĩ rằng Clang là đúng, nhưng tôi muốn xác nhận.
metalfox

Câu trả lời:


6

Có, một biểu thức yêu cầu có thể sử dụng bất cứ thứ gì trong phạm vi. Rốt cuộc, nó chỉ cần loại của bất cứ thứ gì nó đặt tên, ngoại trừ trong một yêu cầu lồng nhau hoặc biểu thức hằng khác. Điều đó đúng với các tuyên bố xung quanh cũng giống như các tham số (chính thức) của chính nó.

[expr.prim.req] / 5 :

Phần thân yêu cầu chứa một chuỗi các yêu cầu . Các yêu cầu này có thể đề cập đến các tham số cục bộ, tham số mẫu và bất kỳ khai báo nào khác có thể nhìn thấy từ ngữ cảnh kèm theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.