if constexpr (sizeof(void*) == 8) { cout << "64bits\n"; } else { cout << "not 64bits\n"; } 对条件的判断和分枝的取舍要在编译期完成哟~ 由于涉及类型信息,所以也不能写到 #if 里哟~ 其实,在 C 语言中可以利用 Generic Selection 实现: #define TG_TEST(E,A,B) \ _Generic( \ ...
// 在ubuntu20.04,g++ 9.4.0使用 g++ -std=c++17 main.cpp编译 #include <iostream> #include <string> #include <cassert> #include <type_traits> template <typename T> void decrement_kindof(T& value) { if constexpr (std::is_same<std::string, T>::value) { value.pop_back(); } ...
首先,句子“即使在if constexpr内,两个静态Assert也将触发“是不正确的,因为if constexpr条件依赖于...
template<typename T>autoany2i(T t){ifconstexpr(std::is_same<T,std::string>::value&&T::npos ==-1){returnatoi(t.c_str()); }else{returnt; } } 如果传入实参类型为std::string,则肯定满足上述条件,但假如传入实参不为std::string,虽然它不满足std::is_same<T, std::string>::value,但由于...
一个 static_assert(F),[其中 F 为假,无论是字面意思还是 constexpr 值] 在被丢弃的 if constexpr 子句中,因此当包含 static_assert 的模板时仍会“咬” --- 被实例化。或者(不是必需的,由编译器决定)如果已知它总是错误的,则已经在声明中。 示例:( 现场演示) #include <type_traits> template< ...
constexpr声明的x1、x2、a1和a2都是编译期必须确定的值。constexpr构造函数内可以使用if语句并且对value进行赋值操作。根据规则5:函数的返回值可以声明为void:返回类型为void的set函数也被声明为constexpr,这也意味着该函数能够运用在constexpr声明的函数体内,make_x函数就是利用了这个特性。
尽管C++23 放宽了static_assert和if constexpr中的布尔转换规则,但并不是所有上下文都允许这种转换。特别是,在noexcept(bool)和explicit(bool)的上下文中,仍然禁止窄化布尔转换。这是因为这些上下文通常用于类型特征(type traits),其结果通常是布尔值或至少是非窄化的 0/1。
@KishanShukla if constexpr 表现得有点像一个模板。假分支仍然会被编译,但并不总是被实例化。如果没有依赖类型,则所有分支都会被检查其有效性。这与预处理器不同。 - Guillaume Racicot 1 @T.C.:真的吗?它甚至无法解析,所以我不确定我们是否达到了“检查”可能实例化的分析水平。 - Davis Herring 1 @Davis...
它的未使用的分支中的代码可能是病态的,因为它的死代码被编译器删除了。if constexpr不依赖于模板。
它的未使用的分支中的代码可能是病态的,因为它的死代码被编译器删除了。if constexpr不依赖于模板。