草庐IT

c++ - 保证复制省略的行为是否取决于用户定义的复制构造函数的存在?

以下代码在使用或不使用用户定义的复制构造函数时表现不同underGCC8.0.1:#includestructS{inti;int*p;S():i(0),p(&i){}//S(constS&s):i(s.i),p(&i){}//#1//S(constS&s):i(s.i),p(s.p){}//#2//S(constS&s)=delete;//#3};Smake_S(){returnS{};}intmain(){Ss=make_S();assert(s.p==&s.i);}使用注释过的用户定义的复制构造函数中的任何一个(即使使用#2,执行简单浅拷贝的构造函数),断言都不会失败,这意味着g

c++ - 为什么在没有参数的情况下调用省略号而不是可变参数模板?

我正在使用以下SFINAE模式来评估可变参数类型列表上的谓词:#includevoidf(int=0);//forexampletemplate()...))>std::true_typecheck(T&&...);std::false_typecheck(...);templateusingPredicate=decltype(check(std::declval()...));static_assert(!Predicate::value,"!!");static_assert(Predicate::value,"!!");static_assert(Predicate::valu

c++ - 为什么在没有参数的情况下调用省略号而不是可变参数模板?

我正在使用以下SFINAE模式来评估可变参数类型列表上的谓词:#includevoidf(int=0);//forexampletemplate()...))>std::true_typecheck(T&&...);std::false_typecheck(...);templateusingPredicate=decltype(check(std::declval()...));static_assert(!Predicate::value,"!!");static_assert(Predicate::value,"!!");static_assert(Predicate::valu

C++省略 `noexcept` 说明符与 `noexcept(false)` ,它们的确切含义是什么?

如果我将函数标记为noexcept(false),或任何其他计算结果为false的表达式,这意味着什么?(1)我是否向编译器保证该函数可以抛出异常?,(2)还是我不保证它是否可以抛出异常?最后,如果我省略了noexcept说明符,它就等价于noexcept(false),还是只等价于上面所说的(2)nd含义? 最佳答案 通过指定noexcept(true),您声称该函数从不抛出异常。通过指定noexcept(false),或不指定任何内容,您并没有声称该函数从不抛出异常。所以它基本上是您的语句(2),但请注意,对于编译器,这相当于您

C++省略 `noexcept` 说明符与 `noexcept(false)` ,它们的确切含义是什么?

如果我将函数标记为noexcept(false),或任何其他计算结果为false的表达式,这意味着什么?(1)我是否向编译器保证该函数可以抛出异常?,(2)还是我不保证它是否可以抛出异常?最后,如果我省略了noexcept说明符,它就等价于noexcept(false),还是只等价于上面所说的(2)nd含义? 最佳答案 通过指定noexcept(true),您声称该函数从不抛出异常。通过指定noexcept(false),或不指定任何内容,您并没有声称该函数从不抛出异常。所以它基本上是您的语句(2),但请注意,对于编译器,这相当于您

c++ - 为什么不能在新的初始化程序中省略数组大小?

这是允许的:inta[]{1,2,3};但不是这个:autoa=newint[]{1,2,3};您必须指定边界。为什么?编辑:正确的语法(不编译)是:autoa=new(int[]){1,2,3};这给出了真正的错误信息,即:error:invaliduseofarraywithunspecifiedbounds 最佳答案 MSalters'answer解决了为什么在最新版本的标准中没有改变这一点。在这里,我将回答附带的问题,“C++11标准中的什么地方禁止这样做?”关于new(int[]){1,2,3}首先,我们需要注意int[]

c++ - 为什么不能在新的初始化程序中省略数组大小?

这是允许的:inta[]{1,2,3};但不是这个:autoa=newint[]{1,2,3};您必须指定边界。为什么?编辑:正确的语法(不编译)是:autoa=new(int[]){1,2,3};这给出了真正的错误信息,即:error:invaliduseofarraywithunspecifiedbounds 最佳答案 MSalters'answer解决了为什么在最新版本的标准中没有改变这一点。在这里,我将回答附带的问题,“C++11标准中的什么地方禁止这样做?”关于new(int[]){1,2,3}首先,我们需要注意int[]

c++ - 在 emplace() 中创建对象时复制省略

我看到很多代码在工作中人们使用emplace和emplace_back和一个临时对象,像这样:structA{A::A(int,int);};vectorv;vector.emplace_back(A(1,2));我知道emplace_back的重点是能够直接传递参数,像这样:v.emplace_back(1,2);但不幸的是,这对少数人来说并不清楚。但我们不要纠缠于此......我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?供您引用...我们正在使用C++14。 最佳答案 Myquesti

c++ - 在 emplace() 中创建对象时复制省略

我看到很多代码在工作中人们使用emplace和emplace_back和一个临时对象,像这样:structA{A::A(int,int);};vectorv;vector.emplace_back(A(1,2));我知道emplace_back的重点是能够直接传递参数,像这样:v.emplace_back(1,2);但不幸的是,这对少数人来说并不清楚。但我们不要纠缠于此......我的问题是:编译器是否能够对此进行优化并跳过创建和复制?还是我真的应该尝试解决这些问题?供您引用...我们正在使用C++14。 最佳答案 Myquesti

c++ - 可以省略 main 函数中的返回类型吗?

这个问题在这里已经有了答案:Whatshouldmain()returninCandC++?(19个回答)关闭6年前。main函数的声明有什么特殊的规则吗?根据ideone这是合法的C++:main()//Asopposedtointmain(){return0;}另一方面,普通函数似乎没有特权避免返回类型:f(){}intmain(){return0;}给出错误:prog.cpp:1:3:error:ISOC++forbidsdeclarationof'f'withnotype[-fpermissive]f(){}^main函数在这种情况下有什么特殊吗?