Questions tagged «c++»

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

1
std :: is_constructible为私有构造函数返回不一致的值
std::is_constructible处理私有构造函数的规则是什么?给出以下代码: #include <iostream> class Class { private: Class() { } }; template <typename T> class Test { public: static void test() { std::cout //<< std::is_constructible<Class>::value << std::is_constructible<T>::value << std::endl; } }; int main() { Test<Class>::test(); } 此打印0(ideone),即T默认情况下不可构造。 取消注释行的注释,它打印11(ideone),因此T突然变为默认可构造的。 我可以找到支持这两个结果的理由,但是我不明白包括注释行如何改变第二个结果。这是以某种方式调用UB的吗?这是编译器错误吗?还是std::is_constructible真的不一致?
13 c++  typetraits 

1
模板类中struct的C ++编译器问题
以下代码无法使用gcc或clang进行编译。 template<class T> class foo{}; template<class T> class template_class_with_struct { void my_method() { if(this->b.foo < 1); }; struct bar { long foo; } b; }; 错误消息是 error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo' 8 | if(this->b.foo < 1); 该错误是由模板类foo引起的。当写<=而不是<1时,它也会编译。 任何提示表示赞赏吗? CompilerExplorer链接https://godbolt.org/z/v6Tygo

3
仅对定义了功能的类型在功能模板内执行功能
我有一个函数模板,它接受许多不同的类型。在这些类型中,只有其中一种具有getInt()功能。因此,我希望代码仅针对该类型运行函数。请提出解决方案。谢谢 #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …

6
如何在C ++中比较泛型结构?
我想以一种通用的方式比较结构,并且我做了这样的事情(我无法共享实际的源代码,因此如有必要,请提供更多详细信息): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } 这通常可以按预期工作,但有时即使两个结构实例具有相同的成员(我已经使用eclipse调试器进行了检查),它有时仍返回false。经过一些搜索,我发现memcmp由于填充了所使用的结构而导致失败。 有没有比较合适的内存填充方式?我无法修改所使用的结构(它们是我正在使用的API的一部分),并且所使用的许多不同结构具有一些不同的成员,因此无法以一般方式进行单独比较(据我所知)。 编辑:不幸的是,我坚持使用C ++ 11。应该早些提到...

2
如何快速评估const expr
我一直在尝试在编译时求值的const表达式。但是我玩了一个在编译时执行起来似乎很快的示例。 #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } 当我运行此代码时,大约需要7秒钟才能运行。到目前为止,一切都很好。但是当我切换long int res = fib(45)到const long int res = fib(45)它时,甚至不需要一秒钟。据我了解,它是在编译时评估的。 但是编译大约需要0.3秒 编译器如何如此迅速地进行评估,但是在运行时却要花费更多的时间?我正在使用gcc 5.4.0。
13 c++  const  constexpr 

4
如何在C ++ 11中实现StoreLoad障碍?
我想编写可移植的代码(Intel,ARM,PowerPC ...)来解决经典问题的变体: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } 其中的目的是为了避免在这两个线程都在做的情况something。(如果两者都不运行,这很好;这不是一次运行的机制。)如果您在下面的推理中发现一些缺陷,请更正我。 我知道,我可以通过memory_order_seq_cst原子stores和loads 实现目标,如下所示: std::atomic<int> x{0},y{0}; void thread_a(){ x.store(1); if(!y.load()) foo(); } void thread_b(){ y.store(1); if(!x.load()) bar(); } 之所以能够达到目标,是因为 {x.store(1), y.store(1), y.load(), x.load()}事件上必须有一些总订单,并且必须与程序订单的“优势”相符: x.store(1) “在TO之前” y.load() y.store(1) “在TO之前” x.load() 如果foo()被调用,那么我们还有其他优势: y.load() “先读值” y.store(1) …

4
cppreference中对宽松顺序的解释是否错误?
在cppreference.com的文档中std::memory_order,有一个宽松订购的示例: 轻松订购 带标签的原子操作memory_order_relaxed不是同步操作;它们不会在并发内存访问之间强加顺序。它们仅保证原子性和修改顺序的一致性。 例如,如果x和y最初为零, // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D 被允许以产生R1 == R2 == 42,因为尽管A被测序-之前线程1中B和C 之前测序线程2内d,没有什么阻止由在y的修改次序出现A之前D和B,从按x的修改顺序出现在C之前。D在y上的副作用对于线程1中的负载A可见,而B在x上的副作用对于线程2中的负载C可见。特别是,如果D在C in之前完成,则可能发生这种情况。线程2,由于编译器重新排序或在运行时。 它说:“在线程2中,C在D之前被排序”。 根据可以在评估顺序中找到的按顺序排序的定义,如果A在B之前排序,则A的评估将在B的评估开始之前完成。由于C在线程2中在D之前被排序,因此C必须在D开始之前完成,因此快照的最后一句的条件部分将永远无法满足。

3
查找包含200000+个元素的2个数组元素的最小乘积的最快方法
我有一个数组a[n]。该号码n由我们输入。我需要找到的最小的产品a[i]和a[j]如果: 1) abs(i - j) > k 2)a[i] * a[j]最小化 这是我的解决方案(非常幼稚): #include <iostream> using namespace std; #define ll long long int main() { ll n,k; cin >> n >> k; ll a[n]; for(ll i=0;i<n;i++) cin >> a[i]; ll mn; bool first = true; for(ll i=0;i<n;i++) { for(ll j=0;j<n;j++) { if(i!=j) …

2
如果constexpr在lambda中带有static_assert,哪个编译器正确?
当我们要在中使用时static_assert,if constexpr必须使条件取决于某些模板参数。有趣的是,当代码包装在lambda中时,gcc和clang不同意。 以下代码使用gcc进行编译,但是clang触发断言,即使if constexpr不能为true。 #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } 这里的例子。 它可以很容易地通过用固定False<T>通过False<decltype(x)>。 所以问题是:哪个编译器正确?我认为gcc是正确的,因为中的条件static_assert取决于T,但是我不确定。

1
MSVC中可能的编译器错误
以下代码使用gcc和clang(以及许多其他C ++ 11编译器)进行编译 #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { data<char> d{to_datatype<int16_t>::value}; } 使用(几乎)最新的MSVC编译时 > cl .\test.cpp /std:c++latest …
13 c++  c++11  visual-c++ 

1
为什么仅当我的容器包含32个以上元素时,std :: sort才会调用swap?
您好,我有一个简单的问题: class A { public: A(int); A(const A&); A& operator=(const A&); ~A(); private: int* ptr_; friend bool operator<(const A&, const A&); friend void swap(A&, A&); }; A::A(int x) : ptr_(new int(x)) {} A::A(const A& rhs) : ptr_(rhs.ptr_ ? new int(*rhs.ptr_) : nullptr) {} A& A::operator = (const A & rhs) …
13 c++  std  swap 

2
如何确定要包括的头文件?
说我有以下(非常简单)的代码。 #include <iostream> int main() { std::cout << std::stoi("12"); } 这在g ++和clang上都可以编译。但是,它无法在MSVC上编译,并出现以下错误: 错误C2039:“ stoi”:不是“ std”的成员 错误C3861:“ stoi”:找不到标识符 我知道这std::stoi是<string>标头的一部分,大概前两个编译器作为标头的一部分<iostream>而后者没有。根据C ++标准[res.on.headers] C ++标头可以包括其他C ++标头。 对我来说,这基本上说所有三个编译器都是正确的。 当我的一个学生提交作业时,这个问题就出现了,TA标记为未编译。我当然去修理了。但是,我想防止将来发生此类事件。因此,有没有一种方法可以确定应该包含哪些头文件,而无需在每次要检查的三个不同的编译器上进行编译? 我能想到的唯一方法是确保对于每个std函数调用都存在一个适当的include。但是,如果您现有的代码长数千行,则搜索起来可能很乏味。有没有更简单/更好的方法来确保交叉编译器的兼容性? 三种编译器的示例:https : //godbolt.org/z/kJhS6U
13 c++ 

1
为什么表达式类型在C ++中的版本之间会发生变化?
我尝试理解C ++的表达式类型,我读的越多,我就越困惑,因为我发现C ++草案很难理解,因此倾向于使用其他资源,但是它们彼此矛盾,或者没有考虑到C ++版本之间的措辞和定义有很大的变化。 在下文中,我指的是以下草案: C ++ 11 [ n3690 ](最终草案) C ++ 17 [ n4659 ](最终草案) C ++ 20 [ n4835 ](当前草案) C++11 3.10左值和右值 ... prvalue(“纯” rvalue)是不是xvalue的rvalue。[示例:调用返回类型不是引用的函数的结果是prvalue。文字的值(例如12、7.3e5或true)也是prvalue。—结束示例] C++17 3.10左值和右值 ... prvalue是一个表达式,其求值初始化一个对象或位域,或计算一个运算符的操作数的值,该值由其出现的上下文指定。 C++20 7.2.1值类别* ... prvalue是一个表达式,其求值初始化一个对象或位字段,或者计算一个运算符的操作数(由其出现的上下文指定),或者是cv void类型的表达式。 我会理解措词的更改,并进行了一些调整,但对我而言,整个定义都会更改。有人可以帮我理解吗?例如,为什么删除了一个句子,即prvalue是不是xvalue的rvalue?还是为什么删除了有用的示例?
13 c++  c++11  c++14  c++17  c++20 

1
gcc中的模糊运算符
我制作了一个用于打印一些stl容器的功能模板 #include <iostream> #include <vector> #include <string> template <template <typename, typename> class C, typename T, typename A> std::ostream& operator<<(std::ostream& os, const C<T, A>& container) { for (auto& elem : container) { os << elem << " "; } return os; } int main() { std::vector<std::string> v { "One", "Two", "Three" …
13 c++  c++17 

2
Derived1 :: Base和Derived2 :: Base是否引用相同的类型?
MSVC,Clang和GCC在以下代码上存在分歧: struct Base { int x; }; struct Der1 : public Base {}; struct Der2 : public Base {}; struct AllDer : public Der1, public Der2 { void foo() { Der1::Base::x = 5; } }; 哥德宝 GCC: <source>: In member function 'void AllDer::foo()': <source>:10:21: error: 'Base' is an ambiguous base …

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.