Questions tagged «c++»

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

1
在C ++ 17中初始化后可以更改内联变量吗?
我的情况如下(它在clang中起作用,但在gcc中不起作用) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp:(dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); 问题在于,内联变量在我希望28的地方显示0,因为它在运行时被修改了。MSVC对此表示不同意,但是clang做了我期望的事情。 问题是:在我的方案中,可以在运行时修改内联变量吗?(我通过取消内联变量解决了问题。)
11 c++  visual-c++  dll  clang  c++17 

1
std :: function const正确性
假设我有一个像这样的可调用类型: struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; 请注意,它mutable_callable具有一个operator()用于修改成员变量的非常量。 现在假设我创建了一个std::function我的类型之外的代码: std::function<int()> foo = mutable_callable{}; 现在我可以这样做: void invoke(std::function<int()> const& z) { z(); } int main() { invoke(foo); // foo changed.....oops } 现在,据我所知,std::functions operator()的信息const如下:https : //en.cppreference.com/w/cpp/utility/functional/function/operator() 所以我的直觉是您不应该这样做..... 但随后查看:https : //en.cppreference.com/w/cpp/utility/functional/function/function 这似乎对可调用类型是否具有常量没有任何限制operator()…… 所以我的问题是:我认为这std::function<int()> …

1
可以是constexpr吗?
所有std :: span的构造函数都声明为constexpr,但是我似乎无法在constexpr上下文中使用它们中的任何一个。取消注释以下任何constexpr都将导致编译错误。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 

1
为什么不为重复的空基存储与vtable指针重叠?
考虑以下示例: #include <iostream> int main() { struct A {}; struct B : A {}; struct C : A, B {}; std::cout << sizeof(A) << '\n'; // 1 std::cout << sizeof(B) << '\n'; // 1 std::cout << sizeof(C) << '\n'; // 2, because of a duplicate base struct E : A …
11 c++ 


5
Lambda的C ++三元赋值
知道为什么以下代码段无法编译吗?它报错“错误:?的操作数:具有不同的类型” auto lambda1 = [&](T& arg) { ... }; auto lambda2 = [&](T& arg) { ... }; auto lambda = condition ? lambda1 : lambda2;

6
基于无辜范围的循环无效
以下内容无法编译: #include <iostream> int main() { int a{},b{},c{},d{}; for (auto& s : {a, b, c, d}) { s = 1; } std::cout << a << std::endl; return 0; } 在Godbolt上尝试 编译器错误是: error: assignment of read-only reference 's' 现在,在我的实际情况中,列表由类中的成员变量组成。 现在,这不起作用,因为表达式变为initializer_list<int>实际上复制a,b,c和d的a,因此也不允许修改。 我的问题有两个: 不允许以这种方式编写基于范围的for循环背后有动机吗? 例如。也许会有一些特殊的情况来表达裸括号。 修复此类循环的语法整洁方法是什么? 最好遵循以下方式: for (auto& s : something(a, b, …


2
尽管明确说明了返回类型,但对lambda的调用还是模棱两可的
鉴于lambda的类型是可确定的(可强制转换为a std::function(请纠正我,如果我错了,请纠正我)),重载函数应该同时使用两个函子。已定义?([&]() -> Type {}) 请注意,对于我当前的解决方案,我需要按引用捕获,这就是为什么代码包含其逻辑的原因。 以下示例描述了该问题: #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified = in; std::cout << …

1
可以将变量模板作为模板模板参数传递吗?
以下荒谬的示例无法编译,但是还有其他方法可以将变量模板作为模板模板参数传递吗? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } 尝试编译器资源管理器


1
在Windows中配置CMake以使用命令行中的clang获得最新的OpenMP支持
我有一个使用OpenMP进行并行化的小型测试项目。我的目标是对其进行编译,以使其生成.dll并.lib用于库(因为我的真实项目链接到使用这些类型分发的外部库),并且支持OpenMP 4.5或更高版本,并且可以从命令行进行操作,因此可以在docker上完成测试和检查(泊坞窗部分不在此问题的范围内,仅供参考,以说明为什么我需要它在命令行中工作)。我可以使用不满意的其他编译器来编译该项目: MSVC:,mkdir build-msvc然后cmake ..(从新创建的文件夹中),最后是cmake --build . --config Release。这可以很好地编译,但是仅支持OpenMP 2.0,因此对于我的真实项目不是一个好的选择。 Intel Parallel Studio:,mkdir build-intel然后cmake .. -T "Intel C++ Compiler 19.0"(从新创建的文件夹中),最后是cmake --build . --config Release。它支持OpenMP 5.0,但其许可证对我而言却相当昂贵。 MinGW x64 g ++:,mkdir build-g++然后cmake .. -G "MinGW Makefiles"(从新创建的文件夹中),最后是cmake --build .。它支持OpenMP 4.5,但该编译器与.lib(据我所知)与我已经提到的对我而言是不兼容的。 我尝试使用clang没有成功: 然后从MSVC中进行CLANG:,mkdir build-clang-msvc然后cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(从新创建的文件夹中),但失败并显示以下错误: -CXX编译器标识是Clang 8.0.1,带有类似MSVC的命令行 -检查工作的CXX编译器:C:/ Program Files(x86)/ Microsoft …

2
weak_ptr重置会影响shared_ptr吗?
我不习惯使用它weak_ptr,我正面临一个令人困惑的情况。我正在将Intel XE 2019 Composer更新5(程序包2019.5.281)与Visual Studio 2019版本结合使用。16.2.5。我用64位编译。我使用标准的C ++ 17。 这是我的秒杀解决方案的代码: #include <memory> #include <iostream> using namespace std; int main( int argc, char* argv[] ) { shared_ptr<int> sp = make_shared<int>( 42 ); cout << "*sp = " << *sp << endl; weak_ptr<int> wp = sp; cout << "*sp = " << *sp …

3
我可以在并行执行策略中使用std :: transform吗?
如果我没有记错的话,我可以std::transform执行到位 ,通过使用同一范围内的输入和输出迭代器。假设我有一些std::vector对象vec,那么我会写 std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) 使用合适的一元运算unary_op。 使用C ++ 17标准,我想通过std::execution::par在其中插入第一个参数来并行执行转换。这会使该函数从上cppreference文章std::transform中的重载(1)变为(2)。但是,对此超载的注释说: unary_op[...]不得使任何迭代器(包括最终迭代器)无效,或修改所涉及范围的任何元素。(自C ++ 11起) “修改任何元素”真的意味着我无法就地使用算法,还是在谈论我误解的其他细节?

1
GCC实施的尖括号包含。为什么必须如下所述?
本文档在其2.6计算的包括部分中具有以下段落: 如果该行扩展到以<令牌开头并包括>令牌的令牌流,则<和第一个>之间的令牌将合并以形成要包含的文件名。令牌之间的任何空格都减少为一个空格;那么将保留初始<之后的任何空格,但忽略闭合>之前的结尾空格。CPP根据尖括号包含的规则搜索文件。 我知道这是实现定义的,但是为什么GCC必须采用这种方式?我指的是上面突出显示的句子。 编辑 我刚刚注意到,上面引用的第三段之前的内容如下: 定义宏时必须小心。#define保存令牌,而不是文本。预处理器无法知道该宏将用作的参数#include,因此它会生成普通标记,而不是标头名称。如果您使用的双引号包含与字符串常量足够接近,则这不太可能引起问题。 但是,如果使用尖括号,则可能会遇到麻烦。 有谁知道这里指出了什么麻烦?
10 c++  c  gcc  language-lawyer 

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.