Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

2
跳过变量初始化格式错误还是会导致不确定的行为?
考虑以下代码: void foo() { goto bar; int x = 0; bar: ; } GCC和Clang 拒绝了它,因为跳转到bar:绕过了变量初始化。MSVC一点也不抱怨(使用x after bar:会引起警告)。 我们可以使用来做类似的事情switch: void foo() { switch (0) { int x = 0; case 0: ; } } 现在所有三个编译器 发出错误。 这些代码片段格式不正确吗?还是引起UB? 我曾经以为两者都是不正确的形式,但是我找不到标准的启示部分。[stmt.goto]不说这事,而且也不[stmt.select] 。

1
为什么C ++标准会处理文件查找方式?
C ++使用该streamoff类型表示(文件)流中的偏移量,并在[stream.types]中定义如下: using streamoff = implementation-defined ; 类型streamoff是已签名的基本整数类型之一的同义词,该基本整数类型的大小足以表示操作系统的最大可能文件大小。287) 287)通常很长很长。 这是有道理的,因为它允许在大型文件中进行查找(与使用相比long,后者可能只有32位宽)。 [filebuf.virtuals]定义了basic_filebuf在文件中进行搜索的功能,如下所示: pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_type等价于streamoff,请参见[iostreams.limits.pos]。但是,该标准随后继续说明了该功能的作用。最后一句话让我很生气,这需要调用fseek: 效果:width表示a_codecvt.encoding()。如果is_open() == false是或off != 0 && width <= 0,则定位操作将失败。否则,如果way != basic_ios::cur或off != 0,并且输出了最后一个操作,则更新输出序列并写入所有未移位序列。接下来,寻找新的位置:if width > 0,请致电fseek(file, width * off, whence),否则请致电fseek(file, 0, whence)。 fseek接受long参数。如果off_type和streamoff被定义为long long(如标准所建议),则可能导致向下转换为long调用时fseek(file, width * …


4
为什么std :: function不参与重载解析?
我知道以下代码不会编译。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } std::function正如我在另一篇文章中所读到的,因为据说不考虑重载解决方案。 我不完全理解强制这种解决方案的技术局限性。 我阅读了有关cppreference 的翻译和模板的阶段,但是我无法想到找不到反例的任何理由。向半熟练的人解释(对于C ++来说仍然是新手),什么以及在什么翻译阶段使以上内容无法编译?

2
这是旧的C ++样式构造函数吗?
这里是一段C ++代码。 在此示例中,许多代码块看起来像构造函数调用。不幸的是,第3块代码不是(您可以使用https://godbolt.org/z/q3rsxn和https://cppinsights.io进行检查)。 我认为,这是一种古老的C ++表示法,它可以解释使用{}(参见#4)引入新的C ++ 11构造表示法的方法。 您是否有T(i)含义的解释,如此接近构造函数表示法,但绝对不同? struct T { T() { } T(int i) { } }; int main() { int i = 42; { // #1 T t(i); // new T named t using int ctor } { // #2 T t = T(i); // new T …
17 c++  c++11 

1
Clang是否正确拒绝仅通过专门化定义类模板的嵌套类的代码?
给定以下类模板: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; 我们Inner为以下每种专业分别定义Outer: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; 然后f针对以下所有专业定义一次成员函数Outer: auto Outer<T>::f(Inner) -> void { } 但是Clang(9.0.0)抱怨: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ 我们还可以通过提供Inner以下所有其他专长的定义来规避编译器错误Outer: template<typename T> struct Outer<T>::Inner {}; 或通过f为每个专业分别定义: template<> auto …

3
有没有办法在Catalina上安装Valgrind?
有没有办法在Catalina上安装Valgrind并使其正常运行?如果是这样,我将非常感谢逐步的过程。 我尝试使用https://github.com/sowson/valgrind安装Valgrind, 但是当我helloWorld.cpp在终端上进行测试时,控制台返回了我不应该得到的错误。 我不确定在此版本的Valgrind的安装过程中是否犯了我的错误,或者Valgrind本身与Catalina OS不兼容。 我也尝试通过Homebrew安装Valgrind,但与此同时我也遇到了问题(github.com/Homebrew/homebrew-core/issues/36683)。

1
任何用constexpr string_view替换全局const char []的陷阱吗?
我们的团队正在使用具有10多年历史的C ++代码库,并且最近切换到了C ++ 17编译器。因此,我们正在寻找使代码现代化的方法。在YouTube的一次会议演讲中,我听到了用替换const char*全局字符串的建议constexpr string_view。 由于我们的代码中有很多这样的const char*全局字符串常量,因此我想问一下是否需要了解一些陷阱或潜在问题?

2
模棱两可的过载模板
我有以下模板代码 #include <vector> #include <array> #include <iostream> template<typename T1> void foo(std::vector<T1> bar) { std::cout << "GENERIC" << std::endl; } template<typename T1> void foo(std::vector<std::vector<T1>> bar) { std::cout << "SPECIFIC (vector)" << std::endl; } template<typename T1, int SIZE> void foo(std::vector<std::array<T1, SIZE>> bar) { std::cout << "SPECIFIC (array)" << std::endl; } int main() …
16 c++  templates 

3
为什么用Rcpp较慢地优化R目标函数,为什么呢?
我目前正在研究一种贝叶斯方法,该方法每次迭代都需要多项步骤来优化多项式logit模型。我正在使用optim()进行这些优化,并用R语言编写了一个目标函数。分析显示optim()是主要瓶颈。 深入研究后,我发现了这个问题,他们建议重新编码目标函数Rcpp可以加快处理过程。我遵循了该建议,并使用编码了我的目标函数Rcpp,但结果变慢了(大约慢了两倍!)。 这是我的第一次Rcpp(或与C ++有关的任何事情),但是我找不到找到矢量化代码的方法。任何想法如何使其更快? Tl; dr:Rcpp中函数的当前实现不如矢量化R快;如何使其更快? 一个可重现的示例: 1)在R和中定义目标函数Rcpp:仅截取多项式模型的对数似然 library(Rcpp) library(microbenchmark) llmnl_int <- function(beta, Obs, n_cat) { n_Obs <- length(Obs) Xint <- matrix(c(0, beta), byrow = T, ncol = n_cat, nrow = n_Obs) ind <- cbind(c(1:n_Obs), Obs) Xby <- Xint[ind] Xint <- exp(Xint) iota <- c(rep(1, (n_cat))) denom <- log(Xint %*% …
16 c++  r  optimization  rcpp 

1
std :: pair <自动,自动>返回类型
我玩弄auto在std::pair。在下面的代码中,函数f应该返回std::pair依赖于模板参数的类型的。 一个工作示例: 例1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } 这适用于gcc 9.2,gcc 10.0,clang 9.0和clang 10.0。 接下来,std::pair出于清楚的原因,我想显式地将返回类型编写为: 例子2 …

2
std :: set是否将对象连续存储在内存中?
是否std::set将对象存储在连续内存中std::vector? 我一直无法在网上找到它,cppreference并未提及有关内存分配的详细信息。但是我看不到为什么它不能使用连续内存,因此我提出了问题。
16 c++  set  stdset 

1
sizeof(enum)是否可以与sizeof(std :: underlying_type <Enum> :: type)不同?
最近出现在以下示例中的代码审查中: enum class A : uint8_t { VAL1, VAL2 }; ... std::vector&lt;A&gt; vOfA; // Assume this is sized and full of some stuff. std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A)); 我们应该使用sizeof(std::underlying_type&lt;A&gt;::type)而不是sizeof(A)。这些可能会有所不同吗?有人提供标准报价来保证这一点吗?

3
可变参数模板:组中展开参数
我有一个带有两个参数的函数: template &lt;typename T1, typename T2&gt; void foo(T1 arg1, T2 arg2) { std::cout &lt;&lt; arg1 &lt;&lt; " + " &lt;&lt; arg2 &lt;&lt; '\n'; } 一个可变参数的参数应该成对转发: template &lt;typename... Args&gt; void bar(Args&amp;&amp;... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward&lt;Args&gt;(args), std::forward&lt;Args&gt;(args) ), ... ); // ^ Sends each argument twice, …

2
[[no_unique_address]]和两个相同类型的成员值
我玩弄[[no_unique_address]]在c++20。 在cppreference的示例中,我们有一个空类型Empty和Z struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; 显然,的大小Z至少必须是2因为e1和的类型e2相同。 但是,我真的很想拥有Zsize 1。这让我开始思考,如何Empty在包装类中使用额外的模板参数来包装,这些模板参数会强制执行e1和类型的不同e2。 template &lt;typename T, int i&gt; struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper&lt;Empty,1&gt; e1; [[no_unique_address]] Wrapper&lt;Empty,2&gt; e2; }; 不幸的是,sizeof(Z1)==2。是否有使大小Z1成为一体的技巧? 我有测试此gcc version 9.2.1与clang version 9.0.0 在我的应用程序中,我有很多空类型的表格 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.