,因爲模板布爾遞延應該評估爲假(你的問題) ....
這是因爲在struct A
的constexpr
的。
constexpr
符能夠在編譯時評估bool
值
取出constexpr
而建,你會發現其中的差別。
爲什麼你static_assert
不工作:
static_assert
期望一個bool_constexpr
。
DEFERRED
只是bool,只有在我們實例化時,模板類體內的值纔是已知的。
嘗試使用以下代碼,我在struct B
的內部添加了另一個bool constexpr
,命名爲test
。並將該變量傳遞給static_assert
。現在您的static_assert
工作。
//g++ 5.4.0
#include <iostream>
struct A { static constexpr bool Value = false; };
template <bool DEFERRED> struct B {
static constexpr bool test = false;
static_assert(test, "Failed");
};
class XYZ {
public:
template <class X = A, class Y = B<X::Value>> int SomeFunction()
{
return 0;
}
};
int main()
{
XYZ xyz;
xyz.SomeFunction();
}
你會發現輸出:
source_file.cpp:8:6: error: static assertion failed: Failed
static_assert(test, "Failed");
^
現在struct B
的test
值更改爲true
。
它的工作原理,沒有錯誤。
還有另外一種情況,分配給DEFERRED
可變test
如下圖所示:
template <bool DEFERRED> struct B {
static constexpr bool test = DEFERRED;
static_assert(test, "Failed");
};
上面說的只是static_assert
的作品,如果你在實例化的main(),像下面。
B<false> b;
「Static_assert」是編譯時斷言。它有效當你有本地bool_constexpr。下面添加了一些測試代碼。 – Naidu