- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设您有一个名为 Product 的类,定义如下:
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs);
Product(const Product &rhs);
~Product();
private:
const char *m_name;
int m_i;
};
然后你像这样初始化一个变量:
auto p = Product{"abc",123};
我认为标准规定编译器必须在逻辑上执行以下操作:
但是允许编译器对其进行优化,以便直接构造 p。
我验证了这一点(Visual Studio 2013),事实上,编译器优化了这一点,即使我们有自己的自定义(非默认)移动构造函数。这很好。
但是,如果我明确删除复制和移动构造函数,如下所示:
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
~Product();
private:
const char *m_name;
int m_i;
};
auto+brace 初始化仍然可以编译。我虽然编译器必须阻止这种情况,因为不允许复制或移动。
奇怪的是,如果我将删除的复制和移动构造函数设为私有(private),如下所示:
class Product
{
public:
Product(const char *name, int i);
~Product();
private:
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
const char *m_name;
int m_i;
};
然后 auto+brace 初始化不再编译。
error C2248: 'Product::Product' : cannot access private member declared in class 'Product'
这是预期的行为吗?这是 Visual Studio 2013(更新 3)中的错误吗?
注意:我尝试在 ideone 上编译它当复制和移动构造函数被删除(和公共(public))时,它确实拒绝编译初始化。所以我认为这是一个 Visual Studio 错误。
最佳答案
你之前说的标准很清楚,说明这是cl-compiler的bug。你永远无法确定,尽管如果一个编译器说了些什么而所有其他编译器都不同意,我希望这将是 MSVC 编译器的许多不符合标准的实现之一。
clang 3.7版本(svn-build)的解读:
t.cpp:19:7:{19:11-19:30}: error: call to deleted constructor of 'Product'
[Semantic Issue]
auto p = Product{"abc", 123};
^ ~~~~~~~~~~~~~~~~~~~
t.cpp:8:2: note: 'Product' has been explicitly marked deleted here
[Semantic Issue]
Product(Product &&rhs) = delete;
^
1 error generated.
make: *** [t.o] Error 1
gcc 4.8的解读:
t.cpp: In function ‘int main()’:
t.cpp:19:29: error: use of deleted function ‘Product::Product(Product&&)’
auto p = Product{"abc", 123};
^
t.cpp:8:2: error: declared here
Product(Product &&rhs) = delete;
^
make: *** [build/gcc/t.o] Error 1
还请记住 Explicitly Defaulted and Deleted Functions自 MSVC 2013 以来是新的,它的实现尚未完成。就像它还不理解移动构造函数的=default。
我的猜测是 MSVC 2013 不会检查移动构造函数或只是回退到复制构造函数。
检查 MSVC 2015 可能会很有趣,因为它似乎具有(更)完整的这些构造的实现。
JV笔
关于c++ - 什么时候允许编译器优化 auto+brace 样式初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31077757/
这个问题在这里已经有了答案: Why can't member initializers use parentheses? (2 个答案) 关闭 7 年前。 #include #include
我正在尝试使用宏以默认值初始化结构元素。不幸的是,我不断收到警告,但我无法找到其解决方案,任何人都可以帮助我了解我到底做错了什么吗? 注意: 我在初始化时收到警告。 我已经尝试了这两个宏,但仍然无法解
我遇到了以下结构: static struct { unsigned char a[5]; } b[] = { {1,1,1,1,1}, {2,2,
我有这个代码: #include int main(int, char **argv) { std::array a = {1,2,3}; } 这编译得很好 (-std=c++11) ,但如果
Npm 审计报告显示“发现 1 个低严重性漏洞”。 1 个漏洞需要人工审核。 Low Regular Expression Denial of Service Pack
template class Vec { T data[S]; public: constexpr Vec(const T& s) : data{s} {} }; templ
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicates: Formatting of if Statements Is there a best coding styl
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
已更新我需要获取大括号 { } 之间的字符。 例如, a {v}" 输出:a,b 和 v 最佳答案 您可以使用 stingr 的 str_extract_all 在下面的表达式中(? a {v}{d}
我想知道是否使用 Belt and Braces (Suspenders)编程方法——尤其是数据验证——是否是好的做法。这来自以下示例。 我正在创建一个表单,并将监听器添加到所有字段中,这意味着 OK
在下面的代码中, struct X { int a; int b; void *ptr; }; class Base { public: int a; int b; void
我正在尝试做这样的事情..我有 3 个头文件 1. coordinates.h typedef struct { float x; float y; float z; }coordinat
是否可以在 C# 中退出作用域,例如可以 break 退出循环? private void a() { // do stuff here { // do more st
我正在学习 c#(和它的 OOP),我在 Visual Studio 中运行以下程序,它不断弹出一个错误,它需要一个花括号 } 我有写在这里。我想不通它为什么要那样。 using System; us
考虑以下两个带大括号的片段: switch (var) { case FOO: { x = x + 1; break; } case BAR: { y = y +
显示双花括号之间多个翻译的标签。 我在 Magento 2 的前端和后端都有这个问题。 这是我迄今为止尝试过的: 清除并刷新缓存 重新部署的静态内容 将 Magento 2.2.5 更新为 2.2.6
我看过这个问题 here . 我想知道是否存在以下缩进样式的官方名称: void fooBar(String s) { while (true) { // ... do
IE浏览器,这个: if (x > 5) return test; 总是会变成: if (x > 5) { return test; } 我不是在谈论大括号样式(Allman、GNU、Whit
这个问题已经有答案了: regular expression does not work with javascript (2 个回答) How do I replace all occurrence
scala coding standards说明 Technically, Scala’s parser does support GNU-style notation with opening br
我是一名优秀的程序员,十分优秀!