• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 285
  • Last Modified:

typename T - statement return Element < T()


Question with regard to the typename T in this statement  'return Elem < T()'.  The typename per the example is 'int' hence the return statement equates to "return Elem < int()".    For Elem 3, we have " return 3 < int() " but I'm confused on what the default construction call for the built in type - in this case - int() equates to?   ie.  "return 3 < ???"


# include <iostream>
# include <string>
# include <iterator>
# include <algorithm>
# include <sstream>
# include <iomanip>
# include <vector>

using namespace std;

// [Predicate] object.
struct RemoveLessThanZero
 {
  template<typename T>
  bool operator()( const T& Elem ) const
    {
     return Elem < T();
    }
 };

int main()
 {
  int Array[] = { 3, 2, 1, 0, -1, -2, -3, -4 };

  // Calculate the size of the array.
  static const std::size_t
         NrElems( sizeof Array / sizeof* Array );

  // Construct the vector with the 'Array' elements.
  std::vector<int> V( Array, Array + NrElems );

  // Print the contents of the vector to stdout.
  std::copy( V.begin(), V.end(),
             std::ostream_iterator<int>( std::cout, " " ) );

  // Remove all negative values from the vector, with
  // the help of our [Predicate] object.
  V.erase( std::remove_if( V.begin(), V.end(),
                           RemoveLessThanZero() ), V.end() );

  // Sort the vector elements prior to printing.
  std::sort( V.begin(), V.end() );
  std::cout << std::endl;

  // Again, print the contents of the vector to stdout.
  std::copy( V.begin(), V.end(),
             std::ostream_iterator<int>( std::cout, " " ) );

  return 0;
 }
0
forums_mp
Asked:
forums_mp
  • 3
  • 3
  • 2
  • +1
2 Solutions
 
AlexFMCommented:
I guess int() calls int constructor which creates int instance and sets it to 0. 3 < int() is like 3 < 0.

Line
i = int();

looks in Disassembly window by the following way:

22:       i = int();
004114DF   mov         dword ptr [ebp-4],0

This means, i = 0.

Other test:

class A
{
public:
    A()
    {
        cout << "A" << endl;
    }
};

    A a;
    a = A();

Result is:
A
A

0
 
itsmeandnobodyelseCommented:
>>>> return Elem < int()".    

That statement compiles but doesn't work for build-in types. So, i would call it a bug. T() creates a new int in your case, that isn't initialized --> the result is undefined.

To make it work, you have to define a member variable of type T that takes an 'empty' or 'zero' instance of type T. You can pass the empty value by the constructor or - more usual - by providing a separate init or set function. The statement above then turns to

   return Elem < m_empty;

Regards, Alex

0
 
itsmeandnobodyelseCommented:
>>>> I guess int() calls int constructor which creates int instance and sets it to 0

No, only VC Debugger initializes 'new' instances with zeroes. There is no 'int' constructor in C++.

Regards, Alex

0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
forums_mpAuthor Commented:

>> So, i would call it a bug.
A bug considering the output made sense on repeated runs ..

>>> To make it work, you have to define a member variable of type T that takes an 'empty' or 'zero' instance of type T. You can pass the empty value by the constructor or - more usual - by providing a separate init or set function. The statement above then turns to

For instance.
0
 
efnCommented:
It's deja vu all over again...

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21031400.html

Summarizing:  A plain old data object whose initializer is an empty set of parentheses should be zero-initialized, as the first Alex said.  However, there are compilers that don't do this right.

--efn
0
 
forums_mpAuthor Commented:

efn

The issue is not default initilization.  I understand that.  I realized though that I've interpreted the call to  V.erase/remove_if incorrectly.   The comparision is
   3 < 0
   2 < 0
   :
   :
  -4 < 0

For some reason I thought (momentary insanity i suppose :)) about an element by element comparison and was trying to figure out how T() fit in..
0
 
AlexFMCommented:
>> No, only VC Debugger initializes 'new' instances with zeroes.

Debugger ??
0
 
itsmeandnobodyelseCommented:
>> Debugger ??

I meant VC Built in 'Debug Configuration'
0
 
AlexFMCommented:
Program built by Microsoft VC++ compiler in Debug Configuration.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 3
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now