Đây là giải pháp hơi điên rồ.
Bỏ ghi chú dòng Const c; foo(c);
và bạn sẽ thấy rằng nó sẽ không biên dịch. Đây là xác nhận thời gian biên dịch.
Yêu cầu variable length arrays và có thể các công cụ biên dịch cụ thể khác. Tôi đang trên g ++ - 4.6.
Kích thước của mảng là 0 hoặc -1, tùy thuộc vào việc hàm thành viên trả về 10. Vì vậy, nếu điều này có thể được tính tại thời gian biên dịch, thì biên dịch nhận ra đó là mảng độ dài không biến và nó có kích thước âm. Kích thước âm cho phép nó phàn nàn. Nếu không, nó rơi qua một khẳng định thông thường.
Xin lưu ý: Tôi nhận được một số kết xuất lõi với phiên bản Thời gian chạy ngay sau khi xác nhận thời gian chạy không thành công. Có lẽ nó không thích cố gắng để free
một mảng với kích thước tiêu cực. Cập nhật: Tôi nhận được bãi lõi với bất kỳ sự thất bại khẳng định, thậm chí int main() {assert (1==2);}
. Điều này có bình thường không?
#include <iostream>
#include <cassert>
using namespace std;
struct Const {
constexpr int member_function() { return 9; }
};
struct Runtime {
int member_function() { return 9; }
};
template<typename T>
void foo(T t) {
if(0) { // so it doesn't actually run any code to malloc/free the vla
int z[(t.member_function()==10)-1]; // fails at compile-time if necessary
}
assert(t.member_function()==10);
}
int main() {
//Const c; foo(c);
Runtime r; foo(r);
}
Nguồn
2013-10-04 20:41:41
Tương tự như http://stackoverflow.com/q/11441302/560648. Không chắc chắn đó là áp dụng mặc dù. –
http://stackoverflow.com/q/6939103/560648 gần hơn và [câu trả lời là "không"] (http://stackoverflow.com/a/6941680/560648). –
[stackoverflow.com/questions/18648069](http://stackoverflow.com/questions/18648069/g-doesnt-compile-constexpr-function-with-assert-in-it) thậm chí còn gần hơn và nói "có nhưng " –