草庐IT

c++ - 为什么数组的大小作为常量变量在 C 中是不允许的,而在 C++ 中是允许的?

我试着写了一个c程序如下?constintx=5;intmain(){intarr[x]={1,2,3,4,5};}当我尝试使用gcc进行编译时会发出警告,如下所示。simple.c:9:error:variable-sizedobjectmaynotbeinitialized.但在C++中也是允许的。当我将x作为数组大小传递时,为什么x不被视为常量? 最佳答案 在C中,const并不意味着“常量”(即在编译时可计算)。它仅表示只读。例如,在一个函数中,这个:constintr=rand();consttime_tnow=time(

c++ - 为什么使用指针 vector 被认为是不好的?

最近有人认为我不应该使用指针vector。我想知道-为什么我不能?例如,如果我有一个类foo,则可以这样做:vectorv;v.push_back(newfoo());我已经看到一些人反对这种做法,这是为什么呢? 最佳答案 在容器中存储普通指针会导致内存泄漏和悬挂指针。将指针存储在容器中不会定义指针的任何类型的所有权。因此容器不知道解构和复制操作的语义。当元素从容器中移除时,容器不知道如何正确销毁它们,当执行复制操作时,不知道所有权语义。当然,您始终可以自己处理这些事情,但仍有可能出现人为错误。使用智能指针将所有权和销毁语义留给它们

c++ - 为什么 std::seed_seq 根据 C++11 是不可复制的,为什么 gcc/clang 不符合?

考虑以下最小示例://main.cpp#includeintmain(int,char**){std::seed_seqseed1{1337,42};std::seed_seqseed2(seed1);std::seed_seqseed3=seed2;return0;}根据C++标准,这不应该编译,因为std::seed_seq既不是copyconstructible,也不copyassignable.然而,这对g++4.9都编译得很好,和clang3.4g++-4.9-std=c++11-Wallmain.cppclang++-std=c++11-Wallmain.cppandroi

c++ - 在哪些架构上计算无效指针是不安全的?

int*a=newint[5]-1;根据C++标准,这一行本身会调用未定义的行为,因为a是无效指针,而不是尾后一指针。同时,这是制作基于1的数组(第一个元素是a[1])的零开销方式,我需要它来获得projectofmine。.我想知道这是否是我需要避免的事情,或者C++标准是否只是保守地支持一些奇怪的架构,而我的代码无论如何都不会在这些架构上运行。所以问题是,这在什么架构上会成为问题?这些是否普遍存在?编辑:要查看上面的行确实调用了未定义的行为,请查看thisquestion.编辑:DennisZickefoose指出,编译器可以在调用未定义行为时执行任何操作,因此编译器和CPU都必须

c++ - 什么是不透明字节串?

我已经使用了一段时间,但没有发现任何有用的东西。什么是不透明字节字符串,什么是它的c/c++示例?更新更多上下文,来自rfc50012.3。NSID选项NSID选项的OPTION-CODE是3。NSID选项的OPTION-DATA是一个不透明字节串,其语义被故意留在协议(protocol)之外。看第3.1节供讨论。 最佳答案 它们可能表示未指定格式的字节数组。“不透明”是指内部结构存在,但未知。因此,程序应将字符串视为一个整体-存储它、传输它,但不尝试解释它。C++示例将是std::vector的一个实例.C示例将是一个unsign

c++ - 带有参数的非纯虚函数是不好的做法吗?

我有一个带有可选虚函数的基类classBase{virtualvoidOnlyImplementThisSometimes(intx){}};当我编译它时,我收到一条关于未使用的参数x的警告。还有其他方法我应该实现虚拟功能吗?我已经像这样重写了它:classBase{virtualvoidOnlyImplementThisSometimes(intx){x=0;}};我还有一个问题,如果我不小心,我创建的子类可能会实现错误的功能,然后由于重载而我没有注意到:例如classDerived:publicBase{voidOnlyImplementThisSometimes(intx,int

c++ - std::runtime_error 的拷贝构造函数和拷贝赋值是不是没有异常?

所有GCC4.8.4、4.9.3、5.3.0都通过了std::exception的测试(对于任何-std=c++11/1y/14/1z/17个选项,如果可用):static_assert(std::is_nothrow_copy_constructible::value,"testexception");static_assert(std::is_nothrow_copy_assignable::value,"testexception");这很好,因为std::exception有noexcept特殊成员(C++1418.8.1):namespacestd{classexceptio

c++ - 访问 'padded'字节是不是UB?

如果我有这样一个对象:struct{uint32_tn;uint8_tc;}blob{};然后会有3个“填充”字节。访问填充字节是不是UB?例如:uint8_t*data=reinterpret_cast(&blob);std::cout我首先假设这可能是UB,但如果这是真的,那么memcpy也将是UB:memcpy(buf,&blob,sizeof(blob));我的具体问题是:访问填充字节是否为UB?如果没有,那是否意味着值也已定义? 最佳答案 不,当整个对象已被零初始化(标准在§8.5/5中说当对象被零初始化时填充被初始化为0

c++ - 是不是所有的c库都可以在c++中使用?

这是一个相当新手的问题。 最佳答案 是的。没有理由不能在C++中使用C库。如果您想在C++编译器中编译C,情况就不同了。CABI得到C++的完全支持,但是从API的角度来看,事情并不一定如此整洁。某些C添加,例如restrict不在C++标准中,必须谨慎处理。 关于c++-是不是所有的c库都可以在c++中使用?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3571638/

c++ - C++ 抽象类是不完整的类型吗?

不完整的类型不能被实例化,抽象类(即纯虚成员函数)也不能被实例化。structincomplete_type;structabstract_class{virtualvoidfoo()=0;};有没有可能抽象类本身被认为是不完整类型? 最佳答案 不!从表面上看它们是相似的(除了抽象类确实有定义而不完整类型没有的事实之外):[n3690:3.9/5]:[..]Objectsshallnotbedefinedtohaveanincompletetype.[n3690:10.4/2]:Anabstractclassisaclassthat