C++14
root.cern.ch
root.cern.ch
Nice. I first saw this in Rust, and it seemed like such an obviously good idea (allowing underscores in numeric literals) that I've wondered why more languages don't do it. Now I'm curious where it originated.
(Incidentally, one of the perils of trying to draw historical conclusions from text searches, or data sets like Google Ngrams: you could get completely wrong results if you miss a shift in spelling or word usage.)
int i = BOOST_BINARY( 1 0010 0010 0000 1000 );I would like to see a universal format agreed on by everyone, so that numbers with separators (call them punctuated numbers) output by one program could be used as input for another, as is often done in Unix pipelines.
The languages that I know of that have punctuated numbers all use underscores. However, having thought about it a lot, I don't think this is a good choice. First, the underscore is often used, as in C, as an additional character in identifiers, but the semantics are different. An underscore in an identifier is significant, in a number it is not:
1_234_567 == 1234567, but
my_long_identifier != mylongidentifier
Also, the underscore is too "big". In a fixed width font, this is irrelevant, but in a variable width font, I think it makes numbers look ugly. The separator should be narrow. In some locales, the apostrophe is used:
1'234'567
I like the thinner character. I have at least one calculator that uses this convention in the display. Alas, this is probably unworkable in computers, since the apostrophe is used commonly for quoting. One option that might work is the back quote:
1`234`567
The back quote isn't used as much as the apostrophe, but it still might cause problems. On US keyboards, it's conveniently located right next to the 1.
Finally, I'd like to see both period and comma accepted as the decimal separator
1`234`567.89 == 1`234`567,89
but there are some obvious problems with that.
My bottom line is that, before C++, or any other language, adds underscores as thousands separators because that's what everyone else did, we should think more deeply about what's needed in a universal format for punctuated numbers.
Unfortunately it doesn’t work in languages without some redundancy, like many in the vector family. Is this a four-vector of one-digit numbers or a one-vector of a four-digit number?
[1 2 3 4]http://docs.oracle.com/javase/7/docs/technotes/guides/langua...
> G++ now supports a -std=c++1y option for experimentation with features proposed for the next revision of the standard, expected around 2017. Currently the only difference from -std=c++11 is support for return type deduction in normal functions, as proposed in N3386.
A few years ago I built an entire framework for automatic reflection in C++ - it worked by querying the export table of the executable or library. Eventually I lost interest and let the project slide, but I think this approach would be a good one to build on.
Granted, it's syntactically shorter to say int x[n], but it's the same behavior as above, and one would need to see what changes have to be made to the runtimes and the standard to allow for this, and how to report errors such as "There is no more space on the stack" (which is going to be much more frequent than running out of heap space).
As for "generic lambdas", I don't find that typing the type of your parameter is too annoying at the moment, though I haven't used the feature much. Perhaps this is a baby step in a move to make C++ a bit more Haskell-like: Strong typing, but also powerful type inference mechanism.
Other languages have more features, that's true. But C++ is still trying to advocate a blazingly fast speed, and pay-for-what-you-use mentality. That the language can still be the fastest, one of the most powerful, and achieve feature parity with current dynamic languages, I think reflects well on the language, not the opposite.
As an aside, there is a grand history of array notation being nothing more than syntax. Try building the following in gcc:
int main() {
int foo[] = {1, 2, 3};
return 1[foo];
}
The expression a[b] is simply translated into a + b, which commutes. There's some constraint applied that something there be a pointer (so 1[2] is rejected) but it's weaker than it "should" be...And how exactly would you do that? alloca() aside, there is no such thing as a stack allocator.
I haven't ever found myself in a situation where I _needed_ my stuff to be stack allocated, but then again I've never done really low level programming or embedded code, and I guess it could happen there.
[1] http://src.chromium.org/viewvc/chrome/trunk/src/base/stack_c...
There's an interesting discussion[1] at comp.std.c++ about implementing VLAs in C++0x, and the issues with dynamic stack resizing.
[1] https://groups.google.com/forum/?fromgroups=#!topic/comp.std...
If they really want to include VLAs then they have to take care of those issues. And in C++ we have std::vector as a safer alternative to raw handling of variable length data.
But not until at least 2017 ... :(
Why are you doing this? C++ has no future, only past.
After working with Ruby for some time, I realized that many co-developers don't have a slightest of a clue what they're doing with the language yet they do just about right with it - with C++ similar (careless) mindset and skill level would very soon end up in a terminated project.
In the end it's the domain which matters more than the languages - as I implied in my earlier comment, I outright require as much control over the hardware as possible - there are no alternatives for me. Rust comes close(and it's nice, I like it thus far!), but let's see in a few years.