Khi trả lời this question, tôi đã thử đoạn code sau đây với gcc (code compiled) và kêu vang (code rejected):constexpr tĩnh trỏ-to-chức năng, sự khác biệt giữa các trình biên dịch
typedef long (*func)(int);
long function(int) { return 42; }
struct Test
{
static constexpr func f = &function;
};
template<func c>
struct Call
{
static void f()
{
c(0);
}
};
int main()
{
Call<Test::f>::f();
}
Tôi không chắc chắn mà trình biên dịch là đúng, mặc dù tôi nghĩ rằng việc khởi tạo constexpr của Test::f
là ok. Các đầu ra lỗi kêu vang là:
error: non-type template argument for template parameter of pointer type 'func'
(aka 'long (*)(int)') must have its address taken
- nào biên dịch là đúng?
- Nếu tiếng kêu là đúng, tại sao và lỗi này thực sự có ý nghĩa gì?
EDIT: vì "lý do", xem DyP's question.
Tôi đang tự hỏi có hay không '& function' thực sự là một khởi tạo giá trị cho' constexpr'. Cả hai trình biên dịch dường như nghĩ như vậy. Nhưng có vẻ như tôi không thích. Điều đó không được biết tại thời gian biên dịch, chỉ vào thời gian liên kết. – Omnifarious
'& function' là địa chỉ của một hàm, vì vậy đối với tôi nó được biết ở thời gian biên dịch ... Ví dụ, bạn có thể chuyển một con trỏ tới hàm như một đối số mẫu. – Synxis
Một con trỏ tới một hàm là một thứ ... nếu đây là một phần của một thư viện được chia sẻ, ví dụ, làm thế nào mà địa chỉ có thể đủ điều kiện như là một 'constexpr'? –