考虑:
struct Person
{
int height;
int weight;
int age;
};
int main()
{
Person p { .age = 18 };
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在C99中是合法的,但在C++ 11中不合法.
什么是C++ 11标准委员会排除了这样一个方便的功能支持的理由?
我相信,inline
已经过时,因为我在这里读到:
无论你如何指定一个函数
inline
,它都是一个允许编译器忽略的请求:编译器可能内联扩展一些,全部或没有你调用指定函数的地方inline
.
然而,Angew似乎理解我不知道的事情.在这个问题中他和我来回走了很多,关于是否inline
仍然有用.
这个问题不是一个问题:
inline
或在哪里inline
仍可用于向编译器提示inline
功能:我应该何时为函数/方法编写关键字'inline'?.inline
运行代码:强制其他翻译单元中的内联函数请记住,编译器可以随意使用inline
,因此inline
在那里没有用处:可以inline
用来强制而不是建议编译代码的更改?
这不是lambda函数问题,我知道我可以将lambda赋给变量.
允许我们声明,但不在代码中定义函数是什么意思?
例如:
#include <iostream>
int main()
{
// This is illegal
// int one(int bar) { return 13 + bar; }
// This is legal, but why would I want this?
int two(int bar);
// This gets the job done but man it's complicated
class three{
int m_iBar;
public:
three(int bar):m_iBar(13 + bar){}
operator int(){return m_iBar;}
};
std::cout << three(42) << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道的是为什么C++会允许two
哪些看似无用,three
哪个看起来更复杂,但却不允许one
?
编辑:
从答案中可以看出,代码内声明可能能够防止命名空间污染,我希望听到的是为什么声明函数的能力已被允许,但是不允许定义函数的能力.
3月21 日,标准委员会投票赞成批准P0174中std::iterator
提议的弃用:
对于读者而言,很长的void参数序列不仅仅是简单地
typedef
在类定义本身中提供预期的s,这是当前工作草案采用的方法,遵循c ++中设置的模式14
在c ++ 17之前std::iterator
,鼓励继承从迭代器样板实现中删除乏味.但弃用将需要以下其中一项:
typedef
sauto
而不是依赖于迭代器来声明类型std::iterator_traits
,可以更新,而继承工作std::iterator
有人可以告诉我我应该期待哪些选项,因为我设计了自定义迭代器,着眼于c ++ 17兼容性?
如果我有一个enum
不为枚举分配数字,它的序数值是0吗?例如:
enum enumeration { ZERO,
ONE,
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };
Run Code Online (Sandbox Code Playgroud)
我已经能够找到一篇文章,引用C99标准需要一个0序数.但我知道C++忽略了C99标准中的几个方面.而且我也能找到一个见证编译器使用序数值为1的帖子,这也是我似乎记得看到的,虽然我不知道多久以前就是这样.
我真的希望看到一个确认C++的答案,但我也想知道即使我在一个中间指定一个值,序数0是否成立enum
:
enum enumeration { ZERO,
ONE,
TWO,
THREE = 13,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE };
Run Code Online (Sandbox Code Playgroud) 我已经重定向"cin"来从文件流中读取cin.rdbug(inF.rdbug())
当我使用提取操作符时,它会读取它直到它到达空格字符.
是否可以使用另一个分隔符?我在cplusplus.com上浏览了api,但没有找到任何东西.
我正在写这个答案,我引自http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters
不能表示为unsigned char且不等于EOF,行为未定义
当我去检查添加了这个短语的编辑时,我发现了作者的评论:
根据C99 7.4/1,不能对任何ctype.h函数使用负符号字符
作者引用C++文档中的C99标准.这有效吗?我在C++标准中找不到关于此函数定义的任何内容,因此我必须假设它是有效的.
但这有两个原因让我担忧:
我在这里问了一个问题:涉及非功能代码的initializer_list返回的生命周期扩展:
const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
Run Code Online (Sandbox Code Playgroud)
我相信lambda试图回归intializer_list
(这很糟糕,不要这样做.)但我得到了一个评论:
它不是一个
initializer_list
,它是一个初始化列表.两件不同的事情.
我只是认为,无论何时你做了一个花括号列表,你都在创建一个intializer_list
.如果那不是正在发生的事情,花括号中的列表是什么?
c++ initialization initializer curly-braces initializer-list
鉴于代码:
#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s("ABCDEFGHIJKL");
transform(s.begin(),s.end(),s.begin(),tolower);
cout<<s<<endl;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
呼叫没有匹配功能
transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)
什么是"未解决重载函数类型"是什么意思?
如果我用tolower
我写的函数替换它,它不再是错误.
在这个答案中,我根据类型的is_arithmetic
属性定义了一个模板:
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
return to_string(t);
}
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)
dyp建议,不是is_arithmetic
类型的属性,是否to_string
为类型定义是模板选择标准.这显然是可取的,但我不知道如何说:
如果
std::to_string
未定义,则使用ostringstream
重载.
声明to_string
标准很简单:
template<typename T> decltype(to_string(T{})) stringify(T t){
return to_string(t);
}
Run Code Online (Sandbox Code Playgroud)
这与我无法弄清楚如何构建的标准相反.这显然不起作用,但希望它传达了我正在尝试构建的内容:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud) c++ ×10
c ×2
deprecated ×2
standards ×2
c++11 ×1
c++17 ×1
c99 ×1
cin ×1
curly-braces ×1
delimiter ×1
dependencies ×1
enumeration ×1
enums ×1
function ×1
functor ×1
initializer ×1
inline ×1
iterator ×1
lowercase ×1
methods ×1
ordinal ×1
result-of ×1
sfinae ×1
stream ×1
templates ×1
tolower ×1
toupper ×1
whitespace ×1