草庐IT

bool_constant

全部标签

c++ - Visual Studio 无法在 bool 运算的上下文中实例化强制转换(转换)运算符模板 (T=bool)

为什么VisualStudio2010和VisualStudio2012无法编译这段代码?Codepad.org、Xcode、gcc、LLVM、Clang都没有问题,但VisualStudio会拉屎:structS{templateinlineoperatorT()const{returnT();}};intmain(){//NOTE:"S()"denotesconstructionintheseexamplesstructF{voidoperator()(bool){}staticvoidtoint(int){}staticvoidtostr(charconst*){}};boolb

c++ - 为什么 set/map emplace_hint 不返回 bool 值

根据cppreference,两个std::set和std::mapemplace函数返回std::pair,带有bool值来说明插入是否实际发生。但是,emplace_hint返回iterator如果插入没有发生,则插入到插入的元素或集合或映射中的现有元素。没有bool这里的值(value)。这些类似功能的界面有什么不同的原因吗?更新功能insert返回bool仅在未提供提示时才有值(value)。这与emplace的行为一致。和emplace_hint.那么问题来了:有什么理由不返回bool什么时候给出提示?我只能认为可能有一些性能原因,因为用户通常会在lower_bound之后提

c++ - 为什么 std::binary_search 返回 bool?

根据草案N4431,函数std::binary_search在算法库中返回bool,[binary.search]:templateboolbinary_search(ForwardIteratorfirst,ForwardIteratorlast,constT&value);templateboolbinary_search(ForwardIteratorfirst,ForwardIteratorlast,constT&value,Comparecomp);Requires:Theelementseof[first,last)arepartitionedwithrespecttoth

c++ - bool 表达式习语中的这个字符串文字是什么?

我的一位同事正在查看我们继承的一个代码库,发现以下行:ATLASSERT(rtaddress==m_lRTAddress&&"CreationsettingsshouldmatchFIFO");我们不明白字符串文字的目的是什么;不仅仅是评论吗?在我看来,如果rtaddress不等于m_lRTAddress那么由于短路,该字符串将永远不会被评估。如果rtaddressDOES等于m_lRTAddress则字符串文字将被评估,但为bool表达式评估的字符串文字将始终返回true;那有什么意义呢? 最佳答案 我认为如果断言失败,您可以看到

c++ - 为什么 std::string 没有隐式转换为 bool

C++中的std::string没有隐式转换为bool有什么原因吗?例如std::strings=""if(s){/*sinnotempty*/}与其他语言(例如python)一样。我认为使用empty方法很乏味。 最佳答案 这可能可以添加,因为C++11已经添加了显式转换和上下文转换的概念。当std::string被设计时,这些都不存在。这使得支持转换为bool的类很难保证安全。特别是,这种转换可能(并且将会)发生在很多你几乎不希望它发生的情况下。例如,如果我们假设std::string如果为空则转换为false,否则转换为tru

c++ - bool 数组上的原始循环比变换或 for_each 快 5 倍

根据我之前对transform和for_each进行基准测试的经验,它们的执行速度通常比原始循环稍快,当然它们也更安全,因此我尝试将所有原始循环替换为transform、generate和for_each。今天,我比较了使用for_each、transform和raw循环翻转bool值的速度,我得到了非常令人惊讶的结果。raw_loop的执行速度比其他两个快5倍。我真的找不到一个很好的理由为什么我们会得到如此巨大的差异?#include#includestaticvoidForEach(benchmark::State&state){std::arraya;std::fill(a.be

c++ - C++11 之前的 "Constant expressions"

constexpr关键字是在C++11中引入的,因为(我认为)是“常量表达式”的相应概念。然而,这个概念隐含在C++98/c++03中,因为数组声明需要一个常量表达式://valid:inta[sizeof(int)];intb[3+7];intc[13/4];constintn=3;intd[n];//invalid:intm=4;inte[m];还有其他“常量表达式”,即可以(和/或必须)在编译时计算的表达式;一个例子是模板参数。对于C++11之前的版本,C++98/03标准或其他地方是否存在以下内容?需要常量表达式的语法结构的完整列表(例如数组声明和模板实例化)管理此类常量表达式

c++ - std::vector<bool> 保证默认所有条目为假?

我希望将std::vector中的所有条目调整为所需的容器大小后都为false。这似乎是测试的情况,但我似乎找不到任何文件可以保证总是如此。我意识到我可以自己将所有内容都设置为false,但如果已经保证每个条目都默认为false,这似乎效率低下(它是一个大小合适的vector,将在数千个地方创建)。对此有任何保证吗?提前致谢。 最佳答案 resize将默认插入元素,按照(C++11)标准调用:allocator_traits::construct(m,p)在哪里m是分配器,p指向目标地址。这反过来(假设m是标准分配器)调用m.con

c++ - 在一个语句中比较 bool 变量,只要数组 C++

假设我有一个bool数组,其中5个bool变量都为真boolboo[10];for(inti=0;i我希望一次将它们全部比较到一个NAND逻辑门中,因为我的问题是我是否总是比较两个变量并将合并的bool值与i+1bool变量进行比较。这给出了错误的结果。boolNANDGate(boolarray[]){boolat;for(inti=1;i当我将boo中的每个变量放入与非门时,我想要的是一个正确的结果,所以可能看起来像这样:boolfunc(boolarray[]){//someloopresult=!(array[0]&&array[1]&&array[2]&&array[3]&&

c++ - 为什么在 C++ 中存在从指针到 bool 的隐式类型转换?

考虑类foo有两个这样定义的构造函数:classfoo{public:foo(conststd::string&filename){std::cout用字符串字面量实例化类,猜猜调用了哪个构造函数?fooa("/path/to/file");输出:ctor2我不了解你,但我认为这不是编程历史上最直观的行为。不过,我敢打赌,这其中有一些巧妙的理由,我想知道这可能是什么? 最佳答案 在C中这样写是很常见的voidf(T*ptr){if(ptr){//ptrisnotNULL}}你应该创建一个constchar*构造函数。