草庐IT

c++ - Visual Studio 2017 是否完全支持具有 [[deprecated]] 属性的 N4266?

coder 2024-02-11 原文

我目前正在研究 C++17 的新特性。我偶然发现了这个功能 N4266 ,它指出现在枚举和命名空间也可以使用属性。不同消息来源称,Visual Studio 2017 已经完全支持该功能。我用 [[deprecated]] 属性编写了一个测试。对于 namespace ,这非常有效。但是,不会为枚举生成警告。我的实现有错误吗?我错过了什么吗?

enum MyEnum
{
    val = 0,
    vaal[[deprecated]] = val
};

void test()
{
    MyEnum e  = MyEnum::vaal; //Should emit Warning, but does not
    MyEnum e2 = MyEnum::val;  //No Warning
}

我使用的是 Visual Studio Community 2017 版本 15.3.5。 This声明自 VS2015 以来就应该支持它。/std:c++17 被使用。

And this还说这应该是正确的语法。

使用 enum 或 enum class 没有区别。

最佳答案

不,不完全是。

我想说这是 MSVC2017 中的当前限制/错误,可能值得提交错误报告,即使在枚举器案例中也可以识别该属性(并且不会提示 C5030 警告;如 Mark 所述在对你问题的评论中)。

附录:现已通过 Hans Passant 提供的链接验证(作为先前已知的错误):


C++17(工作草案)标准,[decl.attr.deprecated] , 状态:

§1 The attribute-token deprecated can be used to mark names and entities whose use is still allowed, but is discouraged for some reason.

§3 The attribute may be applied to the declaration of a class, a typedef-name, a variable, a non-static data member, a function, a namespace, an enumeration, an enumerator, or a template specialization. ...

在使用 MSVC2017 编译时使用 /std:c++17 标志,deprecated 属性适用于除枚举器之外的所有上述内容:

// a class
class [[deprecated]] MyClass {};

// a typedef-name / type alias
[[deprecated]] typedef int MyInt;
using MyFloat [[deprecated]] = float;

// a variable (see main)

// a non-static data member
struct DataMember
{
    int b [[deprecated]];
};

// a function
[[deprecated]]
void myFunction() {}

// a namespace
namespace [[deprecated]] my_namespace
{
    typedef double MyDouble;
}

// an enumeration
enum [[deprecated]] MyEnum {};

// an enumeration
enum MyNewEnum
{
    val[[deprecated]] = 42
};

// a template specialization
template <typename T>
void myTemplateFunction(const T) {} 

template<>
[[deprecated]]
void myTemplateFunction<int>(const int) {}

int main()
{
    MyClass m; // warning C4996: 'MyClass': was declared deprecated
    MyInt i;   // warning C4996: 'MyInt': was declared deprecated
    MyFloat f; // warning C4996: 'MyInt': was declared deprecated
    int j [[deprecated]];
    j = 1;     // warning C4996: 'j': was declared deprecated
    DataMember dm;
    dm.b = 1;  // warning C4996: 'DataMember::b': was declared deprecated
    myFunction();
               // warning C4996: 'myFunction': was declared deprecated
    my_namespace::MyDouble d; 
               // warning C4996: 'my_namespace': was declared deprecated
    MyEnum e;  // warning C4996: 'MyEnum': was declared deprecated
    myTemplateFunction(2);
               // warning C4996: 'myTemplateFunction': was declared deprecated

    MyNewEnum ne = val; // ... no warning

    return 0;
}

gcc 和 clang 都会为上面的 MyNewEnum ne = val;-std=c++14-std=c 调用弃用警告++1z.

在相关说明中,特别是 cppreference's description of the deprecated attribute似乎没有用 N4266 更新,在有效用例声明中不包括“枚举器”和“命名空间”;即使这些都存在于 C++14 standard draft (7.6.5/2) 中.这可能表明这是一个很少使用的功能(应用于枚举器/命名空间),这可以解释为什么它在 MVCS 中被(部分)遗漏了。

  • 编辑:添加了关于此的注释,此后已更正。

官方 MVSC 文档中的一些歧义

最后,attributes section in the MSVC docs并没有真正深入地指定允许使用 deprecated 属性的声明类型;仅显示弃用函数声明的示例。

虽然,正如您所指出的(但是通过指向 cppreference 的链接而不是 MSVC 自己的文档),MSVS2015 does explicitly state conformance to N4266 ,至少对于 C++17。

Compiler Features

C++17 Core Language Features

N4266 Attributes for namespaces and enumerators

Supported: VS2015

然而,Support For C++11/14/17 Features (Modern C++)相反的情况(对于 VS2015):

Compiler Features

C++17 Proposed Core Language Features

N4266 Attributes for namespaces and enumerators

Supported VS2013: No

Supported VS2015: No

关于c++ - Visual Studio 2017 是否完全支持具有 [[deprecated]] 属性的 N4266?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688604/

有关c++ - Visual Studio 2017 是否完全支持具有 [[deprecated]] 属性的 N4266?的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 完全离线安装RVM - 2

    我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  7. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  8. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

随机推荐