草庐IT

assert_nothing_raised

全部标签

c++ - 为什么 `assert` 宏即使与 `NDEBUG` 也有值(value)?

环境:$g++--versiong++(Ubuntu7.4.0-1ubuntu1~18.04)7.4.0众所周知,在包含assert.h之前定义的NDEBUG可以禁用用于调试的类函数宏assert(卡塞特)。但是,在我的环境中阅读/usr/include/assert.h,我发现了下面的代码。#ifdefined__cplusplus&&__GNUC_PREREQ(2,95)#define__ASSERT_VOID_CASTstatic_cast#else#define__ASSERT_VOID_CAST(void)#endif#ifdefNDEBUG#defineassert(exp

c++ - consteval 会允许在函数参数上使用 static_assert 吗?

目前您不能使用static_assert来验证constexpr函数的参数,即使对它的所有调用确实都是constexpr。这是有道理的,因为编译器仍然必须创建此函数的非constexpr实例,以防其他模块尝试调用它。遗憾的是,即使函数是static或在匿名命名空间中也是如此。但是,C++20将引入一个新关键字consteval,它类似于constexpr,但它不允许以非constexpr方式调用函数。在这种情况下,编译器可以确定函数参数在编译时总是已知的。因此,理论上应该可以使用static_assert来验证它们。问题是:标准允许吗?例子:#includeconstevalcharo

c# - 嵌入式单声道 : How do you raise an event in C++?

我正在开发一个嵌入了Mono的应用程序,我想将一个事件从C++层引发到C#层。这是我拥有的:void*itr(NULL);MonoEvent*monoEvent;while(monoEvent=mono_class_get_events(klass,&itr)){if(0==strcmp(eventName,mono_event_get_name(monoEvent)))raiseMethod=mono_event_get_raise_method(monoEvent);}但是,raiseMethod总是返回NULL。查看MonoEvent的结构,似乎填充了add和remove方法,但

C++11 static_assert : Parameterized error messages

在mypreviousquestion我想使用static_assert将模板参数限制为特定的子类型。问题回答完毕,归档代码如下:templatestructX{static_assert(std::is_base_of::value,"TmustbederivedfromY!");};现在,我想让错误信息更简洁。即,我想说明哪种类型违反了此约束。例如,如果类A不是来自Y有人实例化了X,则错误消息应打印“类型参数必须从Y派生,但A不是”。这是否可以通过标准库以某种方式实现?我看到两个挑战:在编译时不使用boost::mpl组装字符串检索实例化T的类型的名称。该名称应该有意义,最好与违规

c++ - 对本周大师的理解 #67 : Double or Nothing

最近,我正在阅读帖子:DoubleorNothingfromGOTWbyHerbSutter我对以下程序的解释有点困惑:intmain(){doublex=1e8;while(x>0){--x;}}假设这段代码在某台机器上运行1秒。我同意这样的代码很愚蠢的观点。但是,根据问题的解释,如果我们将x从float更改为double,那么在某些编译器上,它将保留计算机运行到永远。解释基于标准中的以下引用。引自C++标准第3.9.1/8节:Therearethreefloatingpointtypes:float,double,andlongdouble.Thetypedoubleprovide

c++ - Eclipse C++ "Nothing to build"错误

我在Eclipse中使用C++时一直遇到“无法构建错误”。我什至无法在名为“hw”的项目中运行一个简单的“helloworld”程序:#includeusingnamespacestd;intmain(){cout什么是“无可构建”错误?这是什么意思?为什么会发生?我如何解决它?我检查了在这里和其他地方能找到的线索,但到目前为止没有找到任何帮助。 最佳答案 我遇到了同样的问题。我最终通过仔细按照安装MinGW的说明解决了所有问题,这要求您安装C和C++编译器以及MSYS基本系统和MinGW开发人员工具包。还要确保将C:\MinGW\

c++ - ASSERT_TRUE() 返回类型与 gtest 中的函数类型不匹配

当我使用Gtest中提供的ASSERT_TRUE()时,出现以下错误。返回类型与函数类型不匹配,在VS2010.中带有下划线。abc.h#include"gtest\gtest.h"classabc{pubilc:boolfun();private:boolfun1();};abc.cboolabc::fun(){ASSERT_TRUE(fun1());//Gettingerror:returntypedoesnotmatchfunctiontype}boolabc::fun1(){returntrue;//Trueorfalsedepandingonoperation}

c++ - 借助 static_assert 改进诊断

在模板编程中,static_assert帮助程序员检查模板参数的约束并在违反约束时生成人类可读错误消息。考虑这段代码,templatevoidf(T){static_assert(T(),"firstrequirementfailedtomeet.");static_assert(T::value,"secondrequirementfailedtomeet.");Tt=10;//eventhismaygenerateerror!}我的想法是:如果第一个static_assert失败,这意味着一些T的要求不满足,因此编译应该停止,只生成第一个错误消息——因为继续编译只是为了生成越来越多

c++ - 用于确保设计契约(Contract)的 static_assert

作为开发人员团队的一员,我想确保在我们发布的自定义迭代器上实现一组函数(和运算符)。使用STL迭代器类型作为基类型会有所帮助,但是由于某些原因(超出我的控制范围),我们决定不强制执行STL兼容性。迭代器由同一个团队和整个公司的人员使用。我想设计一个使用迭代器类型并根据设计契约进行测试的模板类。例如,我希望迭代器实现operator++、operator--并声明所需的typedef。1>是否可以实现这样一个强制设计契约的模板类?可能使用static_assert?2>如果是,这是一个好的设计吗?引用:customiterator 最佳答案

c++ - 充分利用 static_assert 和 std::is_invocable

我有一个包含多个函数对象的库,这些函数对象可能只接受几种类型,具体取决于std::is_integral.我要std::is_invocable在条件失败时返回false,但当用户尝试调用函数对象的实例时,我还想要一个不错的static_assert错误消息。这是我目前拥有的函数对象的一个​​简化示例:structfunction{templateautooperator()(Iteratorfirst,Iteratorlast)const->std::enable_if_t::value_type>>{/*something*/}};通过这样的实现,std::is_invocable