2016-08-13 73 views
2

为了在编译时强制对constexpr函数进行评估,我应该是 能够将其返回值分配给constexpr变量。编译时对constexpr的编译时间评估

constexpr bool const_d_ref(const double& v) { return false; } 

int main() { 
    constexpr double dd = 0.0; 
    constexpr bool cb = const_d_ref(dd); 
} 

这似乎很好地工作g++clang++

为了隐藏从消费者的constexpr,我谨实际功能 定义成namespace detail,创建一个新的功能,分配 传回值constexpr变量并返回。

namespace detail { 
constexpr bool const_d_ref(const double& v) { return false; } 
} 
constexpr bool const_d_ref(const double& v) { 
    constexpr bool b = detail::const_d_ref(v); 
    return b; 
} 
int main() { 
    constexpr double dd = 0.0; 
    bool b = const_t_ref(dd); 
    constexpr bool cb = detail::const_t_ref(dd); 
} 

它的工作原理与g++预期,但clang++返回一个编译器错误:

error: constexpr variable 'b' must be initialized by a constant expression

是我在做什么允许?或者clang是限制性的?或者是gcc是放任?

cpp.godbolt.org:gcc 6.1 & clang 3.8

+0

的'双&'必须'constexpr' – Dani

回答

4

vconstexpr bool const_d_ref(const double& v) {不是编译时表达式。因此detail::const_d_ref(v)也不是编译时表达式。

如果你改变bconst您的示例将工作:

const bool b = detail::const_d_ref(v); 

cpp.godbolt.org

+1

即使'v'从未用在身上? – Yakk

+0

@Yakk ...暗示通过称为“标准”的cryptonomicon疯狂搜索... –

+0

@Yakk [expr.const]/2有非常相似的例子:http://coliru.stacked-crooked.com/a/ 7362e7bde98bb417 –