草庐IT

c++ - void* 或 char* 用于通用缓冲区表示?

我正在设计一个Buffer类,其目的是表示一block内存。我的底层缓冲区是char*(嗯,实际上是boost::shared_array,但这并不重要)。我一直在决定为我的构造函数选择什么原型(prototype):我应该去:Buffer(constvoid*buf,size_tbuflen);或与:Buffer(constchar*buf,size_tbuflen);还是别的什么?通常会做什么,为什么? 最佳答案 API接口(interface)对用户来说更加清晰,如果buffer是void*类型,而string是char*类型

c++ - sizeof(size_t) == sizeof(void*) 总是正确的吗?

C99/C++11标准是否保证sizeof(size_t)==sizeof(void*)总是正确的?size_tf(void*p){return(size_t)(p);//Isitsafe?}void*f(size_tn){return(void*)(n);//Isitsafe?} 最佳答案 不,不能保证。使用intptr_t或uintptr_t将指针安全地存储在整数中。存在/曾经是错误的架构是有意义的,例如分段DOS内存模型。那里的内存是由64k段构成的——一个对象永远不会大于一个段,所以16位size_t就足够了。但是,指针具有

c++ - 为什么我不能将 [](auto&&...){} 转换为 std::function<void()>?

当我尝试编译时:#includevoidf(std::functionf){}voidg(){f([](auto&&...){});}在gcc7.3上,我收到以下错误:[x86-64gcc7.3#1]error:couldnotconvert'g()::{}'from'g()::'to'std::function'有人可以解释为什么这是无效的c++吗?还是我应该提交错误报告?(MSVC14接受并将其编译为我所期望的。) 最佳答案 这是gccbug.它将您的lambda解释如下:[](auto&&,...){}所以有一个参数,然后是C

c++ - void main() 有什么问题?

为什么一直不鼓励在C++中将入口点的返回类型设置为void,后来又被标准删除,被现代编译器禁止?为什么它被认为是不好的做法?现在,据我了解,C#和Java都允许入口点的返回类型为void即staticvoidmain(String[]args)/*Java*/staticvoidMain(string[]args)/*C#*/C#和Java程序员并不认为这是不好的做法,事实上他们经常使用它。其他语言(仅打算成为,我怀疑C++至少在这十年内会成功)C++的可能继任者,如D编程语言或Vala也允许无效的主要()。如您所见,我怀疑C++社区将其从标准中删除,因为它太晦涩或不受欢迎。所以我的问

c++ - 为什么 void* 不是迭代器类型?

我用GCC4.8测试了以下代码,因为我们无法形成对void的引用,所以无法编译。#includeintmain(){std::iterator_traitstest;}这是否意味着void*不是iterator?(这里指的是概念)编辑:好的,问题不成立。我实际上要问的是为什么C++需要这样的void*行为?是出于安全考虑,即防止人们写坏东西吗?因为引用void是非法的,所以指针算术是:intmain(){std::uint8_ttest[]={1,2,3};void*wut=test;std::uint8_t*p2=static_cast(wut+1);std::cout(*p2)因此

c++ - 在 void 指针上使用 new

intmain(){void*Foo=new???deleteFoo;}你是怎么做类似上述的事情的?你不能放newvoid[size]。而且我不想知道如何使用malloc()和free()来做到这一点。我已经知道这行得通。我很好奇,想知道new和delete是怎么做的。我在谷歌上搜索了一下,看到了一些关于operatornew(size);和operatordelete(size);这些和new/delete有什么区别?为什么C++不仅仅允许newvoid*[size]? 最佳答案 这样就可以了:intmain(){void*Foo

c++ - void_t 在 Visual Studio 2015 上失败

我不明白为什么以下测试在VisualStudio2015中总是失败(static_assert触发器):#includeusingnamespacestd;templateusingtry_assign=decltype(declval()=declval());templatestructmy_is_copy_assignable:false_type{};templatestructmy_is_copy_assignable>>:true_type{};intmain(){static_assert(my_is_copy_assignable::value,"fail");retu

c++ - void()、逗号运算符 (operator,) 和不可能的 (?) 重载

考虑以下结构:structS{};在C++14中,下面的定义是有效的:constexprautof(){returnS{},'c';}还有下面这个:constexprautof(){returnS{},void();}现在,考虑以下涉及两个定义中的第一个的工作片段:#includestructS{};constexprintoperator,(S,char){return42;}constexprautof(){returnS{},'c';}intmain(){constexprinti{f()};static_assert(i==42,"!");static_assert(std::

c++ - 语句 "(void)c;"的目的是什么?

抱歉标题含糊不清,但不确定如何表达。所以我查看了boost::asio的内部结构(试图找出一些荒谬的延迟),我注意到这样的代码点缀着:op_queuecompleted_ops;task_cleanupc={this,&lock,&completed_ops};(void)c;//EH?现在从正在初始化的结构的名称来看,我猜它正在使用RAII执行一些销毁步骤-很好,但最后一行的目的是什么?我是不是错过了一些非常时髦的东西? 最佳答案 也许是为了避免编译警告,因为没有使用c? 关于c++-

c++ - 我可以在非 void 返回函数上使用 [[noreturn]] 吗?

我从未见过[[noreturn]]之前用于非void返回函数。以下定义是否明确?[[noreturn]]intfunction();intfunction(){while(true){/*impl*/}return0;}返回类型必须是int的原因,是因为函数是通过函数指针传递给另一个函数的。所以假设调用者看起来像这样://callthenon-returningfunctionintvar=(*fptr)();//usevarsomeway(eventhoughthefunctionwillneveractuallyreturn)std::cout这会表现出任何未定义的行为吗?