【问题标题】:msvc and fold expressionmsvc 和折叠表达式
【发布时间】:2023-03-24 21:39:01
【问题描述】:

我在 Windows 上编译此代码时遇到问题。

这段代码可以在 Linux 上正确编译,无论是使用 clang 还是 gcc。我正在使用 msvc 19.29。

Msvc 退出并出现不太有用的错误 C1001。

struct Object{};

class Storage {
    Object &createObject() {
        qStorrage.push_back(Object{});
        return qStorrage.back();
    }

    template <class... Objs>
    void deleteObject(const Objs&...obj)
    {
        const auto e = std::remove_if(qStorrage.begin(), qStorrage.end(), [&](const auto &i) { return ((i == obj) || ...); });
        qStorrage.erase(e, qStorrage.end());
    }
}

目标是能够传递Object的多个引用被删除,避免多次调用同一个函数。

Storage stor;

auto a = stor.create();
auto b = stor.create();

stor.delete(a, b);

你知道为什么 MSVC 编译失败吗?

编辑:

这是实际文件:

https://github.com/zcorniere/logger-cpp/blob/windows/include/Logger.hpp

https://github.com/zcorniere/logger-cpp/blob/windows/example/example.cpp

使用参数 BUILD_EXAMPLE 开启的 cmake 构建

编辑2: 这是msvc错误信息,抱歉我忘记了

message : This diagnostic occurred in the compiler generated function 'bool ProgressBar::operator ==(const ProgressBar &) const' [C:\Users\Zacharie Corniere\Documents\GitHub\logger-cpp\build\example\example.vcxproj]
[build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xmemory(1967): message : see reference to function template instantiation 'bool Logger::deleteProgressBar::<lambda_1>::operator ()<ProgressBar>(const _T1 &) const' being compiled [logger-cpp\build\example\example.vcxproj]
[build]           with
[build]           [
[build]               _T1=ProgressBar
[build]           ]
[build] logger-cpp\include\Logger.hpp(51): message : see reference to function template instantiation '_FwdIt std::remove_if<std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<_Ty>>>,Logger::deleteProgressBar::<lambda_1>>(_FwdIt,const _FwdIt,_Pr)' being compiled [logger-cpp\build\example\example.vcxproj]
[build]           with
[build]           [
[build]               _FwdIt=std::_Deque_iterator<std::_Deque_val<std::_Deque_simple_types<ProgressBar>>>,
[build]               _Ty=ProgressBar,
[build]               _Pr=Logger::deleteProgressBar::<lambda_1>
[build]           ]

【问题讨论】:

  • 在询问有关构建错误的问题时,请始终包含 fullcomplete 错误输出,并以文本形式复制粘贴。适当的minimal reproducible example 也会有所帮助。
  • 什么编译器错误?您使用的是相同的 C++ 版本吗?
  • 我用编译器错误更新了问题。我正在使用 c++20

标签: c++ templates c++20 fold-expression c1001


【解决方案1】:

C1001 是内部编译器错误。

用来表示编译器本身的bug,编译的代码不一定是错的。

将 ICE 报告给 https://developercommunity.visualstudio.com/ 或通过 帮助 > 发送反馈 > 报告问题... 从 Visual Studio

尽量减少产生 ICE 的确切因素。这将有助于生成良好的错误报告并避免代码中出现 ICE,因为可能不会很快提供修复。


我已经简化了你的例子:

#include <vector>

class ProgressBar
{
public:
    std::strong_ordering operator<=>(const ProgressBar &) const = default;
};

std::vector<ProgressBar> v;

    template <class... Objs>
    void deleteObject(const Objs&...obj)
    {
        std::remove_if(v.begin(), v.end(), [&](const auto &i) { return ((i == obj) || ...); });
    }

int main()
{
    ProgressBar p;
    deleteObject(p);
} 

查看重新创建的错误消息:https://godbolt.org/z/dbz34PcTf

我已经举报了。

更新

根据developer community feedback item,这是内部修复的,因此将在一段时间内提供预览版。

但是,我认为它将在 Visual Studio 2022 中,并且不会向后移植到 Visual Studio 2019。


解决方法

除了&lt;=&gt; 运算符,将== 运算符添加到ProgressBar

    std::strong_ordering operator<=>(const ProgressBar &) const = default;
    bool operator==(const ProgressBar &) const = default;

【讨论】:

  • 谢谢!有用 !我虽然宇宙飞船运算符应该替换运算符定义,如 ==、!=、
  • @dorfen_ 因为编译器错误。 Internal Compiler Error 表示存在编译器错误
  • 哦,是的,你是对的。对不起。我不习惯责怪编译器 XD
【解决方案2】:

它不会编译,因为delete 是保留关键字。将“d”更改为“D”。

您还需要在结构定义的末尾添加一个分号。

并且您需要声明 qStorrage 成员(如 std::vector&lt;Object&gt; qStorrage;)。

【讨论】:

  • 对不起,我没有问对,我编辑它以纠正误解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多