小编Bol*_*pat的帖子

使用 co_yield 移动是否需要 std::move ?

假设我有一个std::vector在循环体中声明的并co_yield编辑:

some_generator<std::vector<int>> vector_sequence() {
    while (condition()) {
        std::vector<int> result = get_a_vector();
        result.push_back(1);
        co_yield std::move(result); // or just: co_yield result; 
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,在编辑result后不会再次使用co_yield(或者我犯了一个严重的错误),所以移动它是有意义的。我尝试co_yield使用一种简单的不可复制类型,但std::move它没有编译,因此在通用代码中,可以使用std::move. co_yield编译器是否无法识别这一点(编译器错误?),或者它是总是复制左值的语言所意图的,所以我必须这样做std::move?我知道return作为局部变量的左值看起来像一个副本,但保证是一个移动或更好的复制省略,这看起来与它没有太大不同。

我已阅读C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?,与这个问题相关,但没有回答它,并且当右侧是临时的时考虑了 co_return 与 co_yield,据我所知,这与这个问题无关。

c++ move c++20 c++-coroutine

10
推荐指数
1
解决办法
381
查看次数

根据子类优化超类方法

当类型在另一个类中时,我是否可以在类实例中提供方法的精炼实现(也就是OOP中的覆盖)?或者至少,如果那个其他类是子类.

我有一个C带有方法m的类S,C带有方法s和类型的子类,T a因此有实例化

class C a where m :: [a] -> Bool
class C a => S a where s :: a -> a -> Bool
instance C a => C (T a) where m = ...
instance S a => S (T a) where s = ...
Run Code Online (Sandbox Code Playgroud)

照常.现在碰巧T a是在子类中(我不知道它依赖于什么a),方法m可以实现更高效(二次与指数时间)使用s.

我试图m在实施中"重写"

instance S a => S (T a) …
Run Code Online (Sandbox Code Playgroud)

haskell overriding typeclass

8
推荐指数
1
解决办法
98
查看次数

无法在 Visual Studio 17.5 和 17.6.0 Preview 1.0 中配置拼写检查器

我的 Windows 是本地化的德语,但我使用 Visual Studio 的英语语言包,并且代码和文档首先是英语编写的(即我们仅使用德语来表示领域术语,而没有良好的英语翻译)。

拼写检查器不接受英语单词,并建议使用德语单词进行更正;当然,也不会抱怨恰好在两种语言中都有效的单词。

这里它告诉我,我需要放入spelling_languages = en-usmy.editorconfig才能得到我想要的东西,但由于某种原因,它不起作用。我.editorconfig为此目的添加了一个。

.editorconfig与解决方案 (.sln) 文件和 C# 项目 (.csproj) 文件位于同一文件夹中。其内容就是上面的作业。

我缺少什么?

spell-checking visual-studio editorconfig visual-studio-2022

8
推荐指数
1
解决办法
487
查看次数

模板运算符看似模糊不清

这不是重复的.我查了很多答案,常见问题解答等等.没有什么告诉我新闻.这是简化的代码.获取并解释错误是最小的.

/*** Polynomial.hpp ********************************************************/

namespace Modulus
{
// Forward declaration of the types and non-inline template friend functions.

template <typename T>
    class Polynomial;

template <typename T>
    Polynomial<T>  operator +
        (Polynomial<T> const & p,
         Polynomial<T> const & q);
}

namespace Modulus
{

template <typename T>
class Polynomial
{
public:
    Polynomial() { }

    // [!] when you comment this in, you get the error.
    //Polynomial      operator +      () const { return *this; }

    friend Polynomial operator + <> (Polynomial const & p, …
Run Code Online (Sandbox Code Playgroud)

c++ templates header operators c++11

6
推荐指数
1
解决办法
157
查看次数

非导出声明和私有模块片段中的声明有什么区别?

cppreference.com 关于模块的内容上,它说export

\n
\n

模块接口单元可以导出声明和定义,这些声明和定义可以由其他翻译单元导入。\n[\xe2\x80\xaf\xe2\x80\xa6\xe2\x80\xaf] \n模块接口中导出的
所有声明和定义给定命名模块的单元将在使用导入声明的翻译单元中可用。

\n
\n

据此猜测,我拥有export该模块的用户想要或需要使用它的一切。所有未export编辑的内容都是模块的实现细节,与importers\xe2\x80\x99 无关。

\n

它还告诉我

\n
\n

私有模块片段[ \xe2\x80\xaf\xe2\x80\xa6\xe2\x80\xaf] 允许将模块表示为单个翻译单元,而不使导入器可以访问模块的所有内容。

\n
\n

将某些内容放入私有模块片段中与不放入其中有什么区别exporting 有什么区别?\n我猜\xe2\x80\x99s 与使用导入声明\xe2\x80 的翻译单元中的\xe2\x80\x9cavailable 之间存在差异\x9d 和 \xe2\x80\x9c 对于导入者\xe2\x80\x9d 是可访问的。但从实际角度来看,这有什么区别呢?作为指导,我什么时候将某些内容放入私有模块片段中,什么时候不导出它?

\n

(突出显示我的内引号。)

\n

c++ c++20 c++-modules

6
推荐指数
1
解决办法
484
查看次数

非虚拟多重继承的例子

是否有使用非虚拟多重继承的真实示例?我想有一个主要是出于教学原因。拍身边命名类ABC,和D,其中BC继承A,并D从继承BC是完全没有解释这个问题:“确实/如果一个D对象有一个或两个A子对象?”,但不承担任何关于为什么我们甚至有两个重选项。许多例子关心我们为什么想要虚拟继承,但为什么我们不想要虚拟继承?

我知道什么是虚拟基类以及如何在代码中表达这些东西。我知道菱形继承和具有虚拟基类的多重继承的例子很多。

我能找到的最好的是车辆。基类是VehicleCar和继承的Boat。除其他外, a Vehiclehasoccupants()和 a max_speed()。因此Amphibian,从两者继承Car并在陆地和水上Boat继承不同的东西max_speed()——这是有道理的——但也是不同的occupants()——这是没有道理的。所以Vehicle子对象并不是真正独立的;这是另一个可能很有趣解决的问题,但这不是问题。

有没有一个例子,作为一个真实世界的模型,两个子对象是真正独立的?

c++ multiple-inheritance

5
推荐指数
1
解决办法
195
查看次数

显式删除默认构造函数的目的

I\xe2\x80\x99m 所使用的代码库主要是在 C++11 之前开发的。许多类在私有部分中声明了从未定义的默认构造函数。我\xe2\x80\x99m相当有信心在现代C++中,正确的方法\xe2\x84\xa2是将它们公开并公开= delete它们。到目前为止,我\xe2\x80\x9cupgraded\xe2\x80\x9d 对此进行了无数次的课程,并且它从未导致问题。

\n

我的问题是:为什么要这样做?这个答案说,仅当用户没有给出构造函数时才提供默认构造函数(我猜 \xe2\x80\x99s 不包括= default)并且没有提示它\xe2\x80\x99 不适用于 C++11 之前的版本。当然,在我的所有类 I\xe2\x80\x99m 中都有一个不平凡的构造函数。那么,我缺少什么理由吗?

\n

c++ default-constructor c++14

5
推荐指数
1
解决办法
889
查看次数

为什么我收到未找到分析器的警告?

我创建了一个玩具项目来检查最新的 .NET 7(预览版 5)和正则表达式代码生成。它效果很好,所以我对现有项目应用了相同的更改(不是为了生产,而是为了个人生产力)。由于某种原因,我\xe2\x80\x99m 收到这些警告:

\n
CS8032  An instance of analyzer Microsoft.CodeAnalysis.CSharp.ValidateFormatString.CSharpValidateFormatStringDiagnosticAnalyzer cannot be created from C:\\Program Files\\dotnet\\sdk\\7.0.100-preview.5.22307.18\\Sdks\\Microsoft.NET.Sdk\\codestyle\\cs\\Microsoft.CodeAnalysis.CSharp.CodeStyle.dll : Could not load file or assembly \'Microsoft.CodeAnalysis.CSharp, Version=4.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\' or one of its dependencies. Das System kann die angegebene Datei nicht finden..\nCS8032  An instance of analyzer Microsoft.CodeAnalysis.CSharp.UseUTF8StringLiteral.UseUTF8StringLiteralDiagnosticAnalyzer cannot be created from C:\\Program Files\\dotnet\\sdk\\7.0.100-preview.5.22307.18\\Sdks\\Microsoft.NET.Sdk\\codestyle\\cs\\Microsoft.CodeAnalysis.CSharp.CodeStyle.dll : Exception has been thrown by the target of an invocation..\nCS8033  The assembly C:\\Program Files\\dotnet\\sdk\\7.0.100-preview.5.22307.18\\Sdks\\Microsoft.NET.Sdk\\codestyle\\cs\\Microsoft.CodeAnalysis.CodeStyle.dll does not contain any analyzers.\n
Run Code Online (Sandbox Code Playgroud)\n

文本Das System kann die angegebene …

.net c# visual-studio c#-11.0 .net-7.0

5
推荐指数
1
解决办法
5432
查看次数

技术报告和技术规范有什么区别?

在谈论即将推出的 C++ 功能(例如,此处或 cppreference.com)时,术语“技术规范”“技术报告”似乎可以互换使用,但是我找不到这些术语的任何有意义的区别或定义。即使有,又有什么区别呢?

c++ terminology

4
推荐指数
1
解决办法
539
查看次数

(如何)我可以在一处推断模板类型参数并在其他地方“仅使用”推断的类型吗?

我的函数模板有(除其他外)一个函数指针(或成员函数指针)参数。函数指针可以接受任何参数,参数类型正在被推断。在参数列表的末尾,我希望函数模板采用与函数指针参数相同的参数。

\n
template<typename R, typename... Args>\nvoid f(R(*fp)(Args...), Args... args);\n
Run Code Online (Sandbox Code Playgroud)\n

当参数类型不完全匹配时,问题就开始了,例如 let\xe2\x80\x99s 说fp接受 aBase*并且调用者给f你 aDerived*fp接受 adouble并且调用者放入0(类型为int)。

\n

有什么方法可以告诉编译器Args仅基于fp\xe2\x80\x9c 进行推断并仅使用 \xe2\x80\x9d 这些推断类型,args而不是尝试根据它们绑定到的参数来匹配它们?

\n

c++ templates type-deduction

2
推荐指数
1
解决办法
108
查看次数

如何关闭 AutoClosable 类型的静态变量?

I\xe2\x80\x99m 是 Java 库的作者,该库提供对我们公司销售的 C++ 库的 Java 访问。类 \xe2\x80\x9cown\xe2\x80\x9d C++ 对象之一的实例,具有以下意义:该类具有一些long由某些方法设置的私有字段native,并且具有指向C++ 堆。由于 C++ 堆不会被垃圾回收,因此当拥有的 Java 对象不再需要它们时,特别是当拥有的 Java 对象本身不再需要时,必须手动释放内存,因此该类实现AutoClosableclose()释放实例拥有的所有 C++ 内存。理想情况下,用户将try在该类的实例上使用 -with-resources。

\n

一位客户抱怨 SonarQube 警告他们, \xe2\x80\x99t 不会调用释放资源,并建议在对象上close()使用-with-resources,但该对象由变量或等效对象保存,并且一直存在,直到应用程序关闭(如据我了解)。我想帮助他们,但删除(按照他们的建议)根本就是\xe2\x80\x99不正确。问题与内存有关:当应用程序结束并且 C++ 库被卸载时,内存资源无论如何都会被释放(由操作系统)。trystaticAutoClosable

\n

那么,理想情况下,如何AutoClosable以 SonarQube 检测到的方式关闭静态变量所持有的对象呢?Java 似乎没有可以使用的与类初始值设定项相反的类型。

\n

我不\xe2\x80\x99t 有权访问SonarQube 来玩玩并看看什么可以工作,即当SonarQube 识别出close()将被调用时。我\xe2\x80\x99m 想要告诉他们应该适当地重新配置SonarQube 或抑制警告。问这个问题,我想确保它\xe2\x80\x99本质上是最好的行动方案。\xe2\x80\x9c是的,如果这是真的,\xe2\x80\x9d 将是一个合适的答案。当然,不使用全局状态,即没有 astatic AutoClosable是理所当然的,但我想他们已经知道了。

\n

似乎没有人遇到过static AutoClosable对象的问题,因为 Stack Overflow 上没有关于它的问题。\n我认为这与.NET (C#) 中AutoClosable的类似,并且我发现这个问题非常询问这个问题,但是答案特定于用例和 .NET,并且 …

java static try-with-resources sonarqube autocloseable

2
推荐指数
1
解决办法
98
查看次数