草庐IT

if-constexpr

全部标签

C++17 static 和 constexpr

我正在使用与Xcode9.3捆绑在一起的clang,我试图了解以下结果是否是C++17更改的有意部分:#includetemplatestructTest{staticconstintTEN;};templateconstexprintTest::TEN=10;intmain(intargc,constchar*argv[]){std::cout::TEN当使用c++11或c++14编译时,这将打印“10”。但是,使用c++17编译它时,会打印“0”。这是怎么回事? 最佳答案 在别处发布后,一位clang开发人员承认这是clang-

c++ - ADL 在 constexpr 函数中不起作用(仅限 clang)

以下代码可以使用MSVC和gcc编译,但不能使用clang。为什么会这样?如果CallFoo()是constexpr,ADL似乎无法工作。查看评论。templateconstexprvoidCallFoo()//Removeconstexprtofixclangcompilationerror.{Foo(T());}classApple{};intmain(){CallFoo();}constexprvoidFoo(Apple){}Clang错误消息(seeongodbolt.org)::4:5:error:useofundeclaredidentifier'Foo'Foo(T());

c++ - JNI_CreateJavaVM : Buffer overrun if I throw an exception in case of failure

在C++项目中,我使用JNI调用API来启动JVM。我已经围绕JVM做了一些包装,因此我可以以面向对象的方式使用所有需要的部分。到目前为止效果很好。现在,如果JVM没有启动(JNI_CreateJavaVM返回值JNI_CreateJavaVM之后抛出异常,我遇到缓冲区溢出。如果我在没有JNI_CreateJavaVM调用的情况下引发异常,它会按预期工作。有人知道这里的问题是什么吗?或者如何调试?环境:Windows、VisualStudio2008JDK:jrockit27.6jdk16005,但也发生在SUNstockone上干杯多米尼克 最佳答案

c++ - 从 enable_if 基础继承

我正在尝试为非字符数组部分特化一个特征:templatestructis_container:std::false_type{};templatestructis_container:std::enable_if::value,std::true_type>::type{};VisualStudio2010给了我一个C2039(type不是enable_if的元素...)。但是,SFINAE不应该在这里触底而不是给出编译器错误吗?或者SFINAE不适用于这种情况?当然,我可以将非字符和字符的特化分开:templatestructis_container:std::false_type{

c++ - constexpr(gcc) 错误 - 错误 : a brace-enclosed initializer is not allowed here before '{' token

structX{constexprstaticchara1[]="hello";//Okayconstexprstaticconstchar*a2[]={"hello"};//Error};intmain(){}用gcc编译报错:error:abrace-enclosedinitializerisnotallowedherebefore'{'token这是对constexpr的非法使用吗?编辑我尝试了3个不同版本的gcc,它是在我拥有的最新4.7.0上编译的(我刚刚下载了它,我使用的是mingw-w64),所以它看起来是一个固定的错误(链接到bug会很好!)。4.7.020120311

c++ - `constexpr` `std::array` 的二元运算

我想写一个constexpr函数,减少给定的std::array用二元运算。IE。实现的函数templatereduce(std::array,binary_function);为了简单起见,我想从加法开始。例如sum(std::array{{1,2,3,4,5}});//returns15.到目前为止我得到了什么。我使用常用​​的索引技巧来索引数组元素。IE。生成int序列,可用于通过参数列表扩展进行索引。templatestructseq{};templatestructgen_seq:gen_seq{};templatestructgen_seq:seq{};//gen_seq-

只能用作 constexpr 变量的 C++ 类型

我有一个库类型,它只应该用作全局变量并且必须被链接器初始化(即它必须在静态初始化时间之前具有正确的初始值)。我有充分的理由认为,如果我做以下两件事之一,我将得到我需要的东西:让它成为PODtype,将用户提供的成员放在第一位,并相信用户会将正确数量的表达式传递给Typevar={expr,expr};语法。将实现设为私有(private),提供一个constexpr构造函数并依赖于用户将所有实例声明为constexpr。这些都不好,因为它取决于用户不搞砸事情。缺少宏魔法,有没有办法强制一个类型的所有实例都是constexpr? 最佳答案

c++ - 销毁并重新生成赋值运算符 : what if I'm careful?

这是一个糟糕的模式。copy-and-swap更好。foo&operator=(fooconst&other){static_assert(noexcept(new(this)foo()),"Exceptionsafetyviolation");this->~foo();try{new(this)foo(other);}catch(...){new(this)foo();//doesnotthrowthrow;}return*this;}只要foo是notpolymorphic,会出什么问题?(但是,假设它是一个基类。)背景:我正在处理本地存储类型删除,替代方案是通过本地存储空间将sw

c++ - enable_if : minimal example for void member function with no arguments

我试图更好地理解C++11中的std::enable_if并且一直在尝试编写一个最小的示例:一个类A带有成员函数voidfoo()根据类模板中的类型T具有不同的实现。下面的代码给出了期望的结果,但我还没有完全理解它。为什么版本V2有效,但V1无效?为什么需要“冗余”类型U?#include#includetemplateclassA{public:A(Tx):a_(x){}//EnablethisfunctionifT==int/*V1*///template::value,int>::type=0>/*V2*/template::value,int>::type=0>voidfoo(

c++ - if 子句中的自动赋值

我有下面的代码,它报告“这里不允许自动”//GeSettings()returnsboost::optionalandcouldbeemptyif((autoret=GetSettings(InputField))&&ShouldWeDoThis()){dosomethingwithret;}但如果没问题,可以如下更改。if(autoret=GetSettings(InputField)){if(ShouldWeDoThis()){dosomethingwithret;}}背后的原因可能是傻买请问为什么?我正在使用VisualStudio2017 最佳答案