xxxInPlace or xxxCopy?

spir denis.spir at gmail.com
Thu Jan 20 13:20:49 PST 2011


On 01/20/2011 11:31 AM, bearophile wrote:
 > Andrej Mitrovic:
 >
 >> I think what might help out in D is if we had a way to mark some
 >> functions so the compiler guarantees that their return values *are
 >> not* to be discarded. For example, this code will compile:
 >>
 >> import std.stdio;
 >> import std.string;
 >> void main()
 >> {
 >>      string s = "Mary has a lil lamb.";
 >>      replace(s, "lil", "li'l");  // returns a copy, but discards it
 >> }
 >>
 >> If the replace function is marked with some kind of @nodiscard
 >> annotation, then his would be a compile error since it doesn't make
 >> sense to construct a new string, return it, and discard it.
 >>
 >> But maybe that's going overboard. How often do these kinds of bugs 
creep in?
 >
 > Such bugs are common enough. GNU C has the warn_unused_result 
attribute (that is like your @nodiscard if you use -Werror to turn 
warnings into errors):
 > http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
 >
 > Some C lints require a void cast where you don't want to use a 
function result:
 > cast(void)replace(s, "lil", "li'l");
 >
 > In a language the default is different and where you don't want to 
use a function result you have to add an annotation:
 > unused replace(s, "lil", "li'l");
 >
 > Something like @nodiscard is more useful in C than D because in C 
there are no true built-in exceptions, so error return values are 
common, and ignoring them is a mistake. In some cases like replace() or 
the C realloc() ignoring a result is always a programmer error. So 
something like @nodiscard is useful in D too.

But I thought D had such a feature already. Probably I'm confusing, but 
I think I've had compiler warning in such cases, procisely (ingoring a 
func result).

denis
_________________
vita es estrany
spir.wikidot.com




More information about the Digitalmars-d mailing list