使用Visual Studio 2017的编译器在C ++ 17中使用Lambda编译Kevlin Henney的Fizzbuzz

弗朗西斯·库格勒

在编程时关注Kevlin Henney在Lambdas上的Youtube视频在他的视频中大约20:30-20:40,他给出了以下代码片段:

string fizzbuzz(int n)
{
    auto fizz = [=](function<string(string)> f)
    {
        return n % 3 == 0 ? [=](auto) {return "Fizz" + f("");} : f;
    };
    auto buzz = [=](function<string(string)> f)
    {
        return n % 5 == 0 ? [=](auto) {return "Buzz" + f("");} : f;
    };
    auto id = [](auto s) { return s; };
    return fizz(buzz(id))(to_string(n));
}

这是我在IDE中的实际代码:

#include <functional>
#include <iostream>
#include <string>

std::string fizzbuzz(int n) {
    auto fizz = [=](std::function<std::string(std::string)> f) {
        return n % 3 == 0 ? [=](auto) { return "Fizz" + f(""); } : f;
    };
    auto buzz = [=](std::function<std::string(std::string)> f) {
        return n % 5 == 0 ? [=](auto) { return "Buzz" + f(""); } : f;
    };
    auto id = [](auto s) { return s; };
    return fizz(buzz(id))(std::to_string(n));
}

int main() {
    for (int i = 1; i <= 100; i++)
        std::cout << fizzbuzz(i) << '\n';
    return 0;
}

但是,当我尝试编译此Visual Studio时,会生成以下编译器错误:

1>------ Build started: Project: Data Structure Samples, Configuration: Debug x64 ------
1>main.cpp
1>c:\...\main.cpp(62): error C2445: result type of conditional expression is ambiguous: types 'fizzbuzz::<lambda_9027e592dd51e6f4c5342b61ff8c23f0>::()::<lambda_2463463a8046fa170a40e78d59e9f461>' and 'std::function<std::string (std::string)>' can be converted to multiple common types
1>c:\...\main.cpp(62): note: could be 'fizzbuzz::<lambda_9027e592dd51e6f4c5342b61ff8c23f0>::()::<lambda_2463463a8046fa170a40e78d59e9f461>'
1>c:\...\main.cpp(62): note: or       'std::function<std::string (std::string)>'
1>c:\...\main.cpp(65): error C2445: result type of conditional expression is ambiguous: types 'fizzbuzz::<lambda_c18a2fee5ba13240be9b86f815911a7c>::()::<lambda_2774da13f447e3dfb583778d4ea6d5bd>' and 'std::function<std::string (std::string)>' can be converted to multiple common types
1>c:\...\main.cpp(65): note: could be 'fizzbuzz::<lambda_c18a2fee5ba13240be9b86f815911a7c>::()::<lambda_2774da13f447e3dfb583778d4ea6d5bd>'
1>c:\...\main.cpp(65): note: or       'std::function<std::string (std::string)>'
1>c:\...\main.cpp(68): error C2664: 'void fizzbuzz::<lambda_9027e592dd51e6f4c5342b61ff8c23f0>::operator ()(std::function<std::string (std::string)>) const': cannot convert argument 1 from 'void' to 'std::function<std::string (std::string)>'
1>c:\...\main.cpp(68): note: Expressions of type void cannot be converted to other types
1>Done building project "Data Structure Samples.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

当我根据此处找到的CompilerExplorer进行检查时,此代码将使用所有三个主要编译器进行编译:GCC,Clang和MSVC ...

我知道C ++ 17同时支持lambdasstd::function<T>,但是这种实现或用法类型特定于较新版本的编译器吗?意味着这种技术或用法仅适用于C ++ 20及更高版本吗?如果是这样,可以对此代码段做些什么,以便可以使用提供相同语义和行为的C ++ 17在Visual Studio 2017下对其进行编译?


编辑

以下是有关C / C ++语言部分的所有编译器的命令行设置:

/JMC /permissive- /GS /W3 /Zc:wchar_t /Qspectre /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc141.pdb" /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++latest /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\Data Structure Samples.pch" /diagnostics:classic

Yakk-亚当·内夫罗蒙特

这是一个错误;a?b:c是合法的,如果b可以将其转换为类型的右值,c反之亦然(在其他规则中)。

修理:

auto fizz = [=](std::function<std::string(std::string)> f) {
    if(n%3 == 0)
      f = [=](auto) { return "Fizz" + f(""); };
    return f;
};
auto buzz = [=](std::function<std::string(std::string)> f) {
    if(n % 5 == 0)
      f = [=](auto) { return "Buzz" + f(""); };
    return f;
};

那应该工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Visual Studio 2017中使用CMake设置编译器选项

在Visual Studio 2013中使用Roslyn编译器

使用Visual Studio编译器分析内联的C ++函数

C ++:使用Visual Studio编译器时的const指针

如何在Visual Studio 2015中使用roslyn C#编译器?

使用 Visual Studio 2017 构建 SSDT 项目时如何将 /unsafe 标志传递给 C# 编译器

Roslyn是Visual Studio 2017的默认编译器吗

Visual Studio 2017找不到打字稿编译器?

使用g ++编译器在Visual Studio中编译C ++程序会在最后生成%

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码

在Visual Studio中使用64位编译器

使用Visual Studio 2017创建CS2PHP编译器

Visual Studio 编译器错误(不能使用逗号)

使用Atmel Studio作为通用C编译器

Visual Studio C ++编译器怪异行为

拆解Visual Studio Intel编译器C ++代码

使用 CLion、CMake 和 VS2017 编译器编译 C++17

哪些编译器选项用于在Visual Studio中编译C ++ STL类/函数?

Visual Studio C++ 编译器尝试编译 CUDA C/C++ 文件

如何在Visual Studio中使用更少的自动编译器

配置Visual Studio 2013以允许ASPNETCOMPILER使用x64编译器进行预编译

使用Visual Studio编译器在编译时获取矢量元素的大小(即使它为空)

尝试(失败)在VSC终端中使用tsc在Visual Studio Code中运行(成功安装)TypeScript编译器

在Visual Studio中构建解决方案时使用哪个编译器?

Visual Studio 2013中可能的C / C ++编译器错误

编译器无法在使用cmake配置的Visual Studio项目中执行C ++ 11指令

在Visual Studio中使用自编译的Roslyn?

可以使用参数包编译c ++ 17 lambda继承的编译器

也许是Visual Studio 2015中的C#编译器错误