草庐IT

if-constexpr

全部标签

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

采用以下代码:#includeconstexprstd::arraya{};static_assert(std::next(std::begin(a))==std::begin(a)+1);使用-std=c++17GCC可以完美地编译它,但Clang会提示该表达式不是整型常量表达式。看起来问题出在std::next上,但是在C++17中应该是constexpr。尽管如此,std::next在std库中,而不是在编译器本身中,因此发生了一些奇怪的事情。为了让事情变得更好,如果您将-stdlib=libc++传递给Clang,该示例将完美编译。这是怎么回事?谁对谁错?编辑这个问题似乎与cl

c++ - 如果函数被称为 constexpr,则有条件地 static_assert

我知道有人提议使用constexpr()运算符,但这还没有在gcc/clang中实现。我也知道有一个使用机器代码编辑等技巧的实现:http://saadahmad.ca/detecting-evaluation-context-inside-constexpr-functions/我想知道是否有一个有点受限的解决方案:structF{constexprF(intv){ifconstexpr(constexpr()){static_assert(v>0);}else{assert(v>0);}}};//...constexprFf{0};//shouldtriggeracompile-t

c++ - 在同一类中使用 constexpr 作为模板参数时出错

如果我尝试编译以下C++0x代码,我会收到一个错误:templatestructfoo{};structbar{staticconstexprintnumber(){return256;}voidfunction(foo&);};对于gcc4.6.1,错误信息是:test.cc:6:27:error:‘staticconstexprintbar::number()’usedbeforeitsdefinitiontest.cc:6:28:note:intemplateargumentfortype‘int’使用clang2.8,错误信息是:test.cc:6:20:error:non-t

C++11 Dynamic Cast If Else Chain -> 开关

考虑以下几点:structB{};templatestructD:B{Tt;}voidg(inti){...}voidg(strings){...}voidg(charc){...}voidf(B*b){if(dynamic_cast*>(b)){g(dynamic_cast*>(b)->t);}elseif(dynamic_cast*>(b)){g(dynamic_cast*>(b)->t);}elseif(dynamic_cast*>(b)){g(dynamic_cast*>(c)->t)}elsethrowerror;};这里只有三种可能的T类型——int、string、char

c++ - 无限递归 `enable_if`

在尝试为另一种类型T编写wrapper类型时,我遇到了一个相当令人讨厌的问题:我想定义一些二元运算符(例如+)将wrapper上的任何操作转发给底层类型,但我需要这些运算符接受任何涉及wrapper的潜在组合:wrapper()+wrapper()wrapper()+T()T()+wrapper()天真的方法涉及直接编写所有潜在的重载。但我不喜欢编写重复的代码并且想要更多的挑战,所以我选择使用一个非常通用的模板来实现它并使用enable_if限制潜在的类型。我的尝试显示在问题的底部(抱歉,这是我能想到的最小值)。问题是它会遇到无限递归错误:为了评估test()+test(),编译会查看

c++ - 不完整类型的嵌套静态 constexpr。 C++ 是否有效?

Clang和GCC在以下代码是否有效C++11上存在分歧:structThing{intvalue;staticconstThingthing;};constexprThingThing::thing{3};Clang编译它并且GNUGCCversion4.7.2说:错误:重新声明“Thing::thing”在“constexpr”中不同constexprThingThing::thing{3};哪个编译器对标准的解释是正确的?C++14标准似乎要对此事发表一些新的看法吗? 最佳答案 简介该代码段在C++11中是合法的,并且在C++

c++ - constexpr 构造函数是否允许 return 语句?

如thispage中所述,constexpr构造函数主体的复合语句,如果不删除也不默认,必须满足constexpr函数主体的约束,即它可能包含任何声明,除了:asm声明goto语句try-block非文字类型或静态或线程存储持续时间或未执行初始化的变量的定义标准似乎没有限制可能出现的return语句的数量,而在C++11中,只允许出现一个。现在,考虑以下代码:classThing{public://Shouldn'tthisconstructorbefineunderbothC++11andC++14?constexprThing(){return;}};intmain(){Thing

模板类型的 C++ Constexpr 成员

我想创建一个模板类,其成员是一个constexpr数组。当然,数组需要根据它的类型进行不同的初始化,但我不能在不初始化数组的情况下声明它。问题是在模板专门化之前我不知道数组的值。//A.hpptemplateclassA{public:staticconstexprTa[];constexprA(){};~A(){};}//B.hppclassB:publicA{public:constexprB();~B();};//B.cpptemplateconstexprintA::a[]={1,2,3,4,5};B::B(){}B::~B(){}如何正确初始化B中的A::a[]?

c++ - constexpr 模板参数怪异

GCC(5.3)&Clang(3.8)声称test中的第一行是错误的,但第二行是好的。MSVC(2015.2)说,两者都无效。templatevoidf(Nn,Tt){std::get(t);}voidtest(){std::get()>(std::make_tuple(123));//notokf(std::integral_constant(),std::make_tuple(123));//okforgcc,clang,butnotmsvc}根据标准,究竟有什么区别?这段代码一开始是合法的吗?第一行的clang错误:Infileincludedfrommain.cpp:2:/us

c++ - 从 std::true_type 继承 vs static constexpr const bool 成员

我知道这不是一个非常尖锐的问题。使用一个比另一个有优势(编译时间、依赖性、调试符号大小、可用性、可读性等)吗?templatestructIsSharedPtr:std::false_type{};对比templatestructIsSharedPtr{staticconstexprboolvalue=false;};相关问题...templatestructS;templatestructS{};templatestructS{};对比templatestructS;templatestructS{};templatestructS{}; 最佳答案