Questions tagged «c++»

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

1
GCC无法报告格式错误的constexpr lambda调用
以下是两个未定义行为的测试用例,表示为IIFE(即所谓的Lambda-Axpression): constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = -x; // Undefined Behaviour return y; }(); int main() {} 使用GCC主干编译时,test4由于它在中显示出Undefined Behavior ,因此被正确拒绝constexpr。另一方面test3被接受。 GCC有权接受test3吗?

1
在不同的编译器上转换为void **
我一直在通过不同的编译器运行以下代码: int main() { float **a; void **b; b = a; } 从我已经能够收集,void **是不是一个普通的指针,这意味着从另一个指针任何转换不应该编译或至少抛出一个警告。但是,这是我的结果(全部在Windows上完成): gcc-如预期的那样发出警告。 g ++ -引发错误,如预期的那样(这是由于C ++的宽松输入造成的,对吧?) MSVC(cl.exe) -即使指定了/ Wall,也不会引发任何警告。 我的问题是:我是否遗漏了全部内容?是否有任何特定原因导致MSVC无法发出警告?MSVC 做转换时产生警告从 void **到float **。 还要注意的另一件事:如果我将其替换a = b为显式转换a = (void **)b,则所有编译器都不会发出警告。我认为这应该是无效的演员表,所以为什么不会有任何警告? 我问这个问题的原因是因为我开始学习CUDA并在官方编程指南(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory)中学习可以找到以下代码: // Allocate vectors in device memory float* d_A; cudaMalloc(&d_A, size); 应该执行对void **for 的隐式转换&d_A,因为的第一个参数cudaMalloc是类型void **。在整个文档中都可以找到类似的代码。这只是NVIDIA的草率工作,还是我又错过了什么?由于nvcc使用MSVC,因此代码编译时不会发出警告。
9 c++  c  cuda 

1
从函数指针数组中传递函数指针作为模板参数
我想将功能指针数组中的功能指针作为模板参数传递。即使Intellisense抱怨有些问题,我的代码似乎还是使用MSVC编译的。gcc和clang均无法编译代码。 考虑以下示例: static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] = { test }; template <FunctionPointer function> static void wrapper_function() { function(); } int main() { test(); // OK functions[0](); // OK wrapper_function<test>(); // OK wrapper_function<functions[0]>(); // Error? } MSVC编译代码,但是Intellisense给出以下错误:invalid nontype template argument of type "const …
9 c++  templates  c++14 

1
如何在C ++ 20中实现shift_right()?
在C ++ 20中,<algorithm>标头获得了两个新算法:shift_left()和shift_right()。他们两个都接受任何LegacyForwardIterator。对于shift_left(),指定了``移动i从​0'' 开始以递增顺序执行; 对于shift_right(),指定为“如果ForwardIt满足LegacyBidirectionalIterator要求,则以i从开始的降序执行移动last - first - n - 1。” 我可以想到一种相当容易实现的方法shift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; …

3
unique_ptr <0或小于运算符的作用是什么?
我正在处理不是由我编写的代码。我有这句话: // p is type of std::unique_ptr&lt;uint8_t[]&gt; if (p &lt; 0) { /* throw an exception */ } 那么p &lt; 0在这种情况下意味着什么呢? 在文档页面,我相信我的情况是16) y &lt; nullptr,这里0是nullptr。 但是它是做什么的呢?

5
如何在模板中返回正确的数据类型?
#include &lt;iostream&gt; using namespace std; template &lt;class X, class Y&gt; Y big(X a, Y b) { if (a &gt; b) return (a); else return (b); } int main() { cout &lt;&lt; big(32.8, 9); } 在这里,我在CPP中使用模板,因此,当我big绕过doubleand int类型的参数调用函数时,我希望返回的答案是double。这里的类型,它返回32而不是32.8。 如何获得所需的输出?如何编写适当的返回类型的big函数?

1
clang / gcc类专业化不一致
我碰到这个问题,而试图专注tuple_size/ tuple_element自定义类在C ++ 17的结构结合。 下面的代码在GCC中编译,但在clang中不编译(两个主干版本,请参见下面的链接)。 #include &lt;type_traits&gt; template&lt;typename T, typename... Ts&gt; using sfinae_t = T; template&lt;typename T, bool... Bs&gt; using sfinae_v_t = sfinae_t&lt;T, typename std::enable_if&lt;Bs&gt;::type...&gt;; template &lt;typename T&gt; struct Test; template &lt;typename T&gt; struct Test&lt;sfinae_v_t&lt;T, std::is_integral_v&lt;T&gt;&gt;&gt; {}; void f() { Test&lt;int&gt; t; } https://godbolt.org/z/ztuRSq 这是clang提供的错误: &lt;source&gt;:13:8: error: class template partial …

2
类型双关主题的变化:就地琐碎构造
我知道这是一个很普通的主题,但是尽管很容易找到典型的UB,但到目前为止我还没有找到这个变体。 因此,我尝试正式引入Pixel对象,同时避免实际复制数据。 这有效吗? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v&lt;Pixel&gt;); Pixel* promote(std::byte* data, std::size_t count) { Pixel * const result = reinterpret_cast&lt;Pixel*&gt;(data); while (count-- &gt; 0) { new (data) Pixel{ std::to_integer&lt;uint8_t&gt;(data[0]), std::to_integer&lt;uint8_t&gt;(data[1]), std::to_integer&lt;uint8_t&gt;(data[2]), std::to_integer&lt;uint8_t&gt;(data[3]) }; data += sizeof(Pixel); } return result; // throw in …

1
新的(this)ThisClass()是个坏主意吗?
class FooView final : public Something { ... void refresh() { this-&gt;~FooView(); new (this) FooView(); } } 我从未见过这种习语,而且看起来确实很微妙和凌乱,但实际上我想不出它有什么问题(只要FooView是最终的)。这是一个坏主意吗?

4
隐藏空的基类以进行聚合初始化
考虑以下代码: struct A { // No data members //... }; template&lt;typename T, size_t N&gt; struct B : A { T data[N]; } 这是初始化B的方式:B&lt;int, 3&gt; b = { {}, {1, 2, 3} }; 我想避免基类不必要的空{}。Jarod42 在此处提出了一个解决方案,但是,它不适用于元素默认初始化:B&lt;int, 3&gt; b = {1, 2, 3};很好,但B&lt;int, 3&gt; b = {1};不是:b.data[1]并且b.data[2]没有默认初始化为0,并且发生了编译器错误。有什么办法(或c ++ 20会有)从构造中“隐藏”基类?

1
比较std :: string和C样式的字符串文字
假设我有以下代码: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; // or std:: int main() { string s1{ "Apple" }; cout &lt;&lt; boolalpha; cout &lt;&lt; (s1 == "Apple") &lt;&lt; endl; //true } 我的问题是:系统如何在这两者之间进行检查?s1是一个对象,同时"Apple"是C样式的字符串文字。 据我所知,无法比较不同的数据类型。我在这里想念什么?

1
运算符new的执行顺序和构造函数的参数
C ++规范是否指定in 的顺序operator new和构造函数。 g ++的顺序为-&gt; -&gt; ,而clang ++ 的顺序为-&gt; -&gt; 。 差异是由未指定的行为引起的吗?Anew C(A())A()newC()newA()C() g ++:7.4.0 clang ++:10.0.0 #include &lt;iostream&gt; #include &lt;cstdlib&gt; struct A { A() { std::cout &lt;&lt; "call A()\n"; } }; struct C { C(A) { std::cout &lt;&lt; "call S()\n"; } void *operator new(size_t s) { std::cout &lt;&lt; …

1
是否可以将零添加到空指针?
我知道对于空指针不允许使用指针算术。但是想象一下我有这样的事情: class MyArray { int *arrayBegin; // pointer to the first array item, NULL for an empty array unsigned arraySize; // size of the array, zero for an empty array public: int *begin() const { return arrayBegin; } int *end() const { return arrayBegin + arraySize; } // possible? (arrayBegin …

1
从Rcpp函数返回指向`new`对象的指针的正确方法
考虑1)具有潜在的大内存打印的自定义类,以及2)执行一些预处理,然后创建并返回我们的自定义类的新对象的顶级函数。为避免不必要的值复制,该函数分配对象并返回指向它的指针。 根据前面的讨论,似乎将指针返回到新创建的对象的正确方法是将其包装为Rcpp::XPtr&lt;&gt;。然而,R则认为它有效的externalptr,而我在努力寻找与现代投它的正确方法RCPP_EXPOSED_CLASS和RCPP_MODULE做事的方式。 另一种方法是返回原始指针。但是,我不能100%地确定对象内存是否已正确清理。我跑去valgrind测试内存泄漏,但没有发现任何泄漏。但是,谁清理呢?R? 测试文件 #include &lt;Rcpp.h&gt; // Custom class class Double { public: Double( double v ) : value(v) {} double square() {return value*value;} private: double value; }; // Make the class visible RCPP_EXPOSED_CLASS(Double) // Option 1: returning raw pointer Double* makeDouble( double x ) { Double* pd = new …
9 c++  r  rcpp 

1
-fno-char8_t的MSVC等效项是什么?
在C ++ 20中,u8字符串文字是基于char8_t类型的。它们故意不再转换为char const*: const char* str = u8"Hall\u00f6chen \u2603"; // no longer valid in C++20 当然,迁移到C ++ 20时的最终目标是完全采用新行为(在上面的示例中:更改的类型str)。但是,由于有第三方库,因此通常无法立即实现。 引入和“补救” 的建议char8_t预期并提到在clang和gcc中有一个-fno-char8_t标志可以切换回旧的行为(同时仍然可以享受其他C ++ 20功能)。 第二个建议设置了微软将遵循并添加类似标志的期望,但是我无法找到如何设置它(至少在VS 2019版本16.4中)。 那么有人知道MSVC的含义-fno-char8_t是什么吗?

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.