Lỗi trình biên dịch có thể có trong MSVC


13

Đoạn mã sau biên dịch với gcc và clang (và nhiều trình biên dịch C ++ 11 khác)

#include <stdint.h>

typedef int datatype;

template <typename T>
struct to_datatype {};

template <>
struct to_datatype<int16_t> {
  static constexpr datatype value = 1;
};

template <typename T>
class data {
 public:
  data(datatype dt = to_datatype<T>::value) {}
};

int main() {
  data<char> d{to_datatype<int16_t>::value};
}

khi biên dịch với (gần như) MSVC mới nhất

> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled

Đây có phải là lỗi của MSVC không? Nếu có, thuật ngữ nào trong tiêu chuẩn C ++ mô tả đúng nhất về nó?

Nếu bạn thay thế một phần của mã bằng

template <typename T>
class data {
 public:
  data(datatype dt) {}
  data() : data(to_datatype<T>::value) {}
};

dù sao nó cũng biên dịch trơn tru.


Điều này một lót có thể giải thích sự khác biệt. Xem những gì trình biên dịch của bạn trở lại cho std::is_same_v<char, int8_t>. Tôi đoán là việc triển khai được xác định liệu int8_t có giống như char hay không, nhưng người ta sẽ cần kiểm tra tài liệu.
thay đổi igel

Có vẻ như trên thực tế nó có thể là một lỗi. Vấn đề này đã được mở gần đây và đã có một số báo cáo khác.
thay đổi

1
@alteredinstance Tôi không thấy vấn đề đó liên quan đến câu hỏi này như thế nào, hoặc liên kết trước đó của bạn như thế nào, cho vấn đề đó. Bạn vừa sao chép liên kết đầu tiên google đưa ra cho thông báo lỗi này? Thông báo lỗi rất chung chung và có thể xuất hiện trong nhiều tình huống (hợp pháp) khác nhau.
quả óc chó

@walnut Dòng 231 của mã được đề cập trong vấn đề này có liên kết không chính xác với vấn đề MSVC với khởi tạo tổng hợp, điều tương tự mà mã OP đang làm. Thực tế là thư viện boost gần đây đã gặp phải một vấn đề tương tự với việc sử dụng valuetrong một loại tổng hợp với MSVC
thay đổi

Câu trả lời:


8

Tôi sẽ nói MSVC sai khi không chấp nhận mã.

Theo [dcl.fct.default] / 5 của dự thảo cuối cùng tiêu chuẩn C ++ 17, việc tra cứu tên trong các đối số mặc định của hàm thành viên của mẫu lớp được thực hiện theo các quy tắc trong [temp.inst].

Theo [temp.inst] / 2 khởi tạo ngầm định của mẫu lớp không gây ra việc khởi tạo đối số mặc định của các hàm thành viên và theo [temp.inst] / 4 một đối số mặc định cho hàm thành viên của (chuyên môn hóa không rõ ràng về a) mẫu lớp được khởi tạo khi nó được sử dụng bởi một cuộc gọi.

Không có cuộc gọi nào sử dụng đối số mặc định to_datatype<T>::valuetrong mã của bạn và vì vậy nó không nên được khởi tạo. Do đó không nên có một lỗi về tra cứu của valuetrong to_datatype<char>thất bại.

(Các phần có liên quan trong bản nháp cuối cùng của tiêu chuẩn C ++ 11 có từ ngữ tương đương, ngoại trừ việc đánh số, hãy xem [Dec.fct.default] / 5 , [temp.inst] / 1[temp.inst] / 3 thay thế.)

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.